我如何从猫鼬模式中拼接一个项目,然后保存文档或模式?



我在删除用户模式内的数组中的项目时遇到麻烦,然后当我试图保存文档时,它会给我这个错误?

错误如下:

TypeError: User.save is not a function
at C:UsersChildrenDesktopWeb ProjectsSermon_Trackerapp.js:194:10
at Layer.handle [as handle_request] (C:UsersChildrenDesktopWeb ProjectsSermon_Trackernode_modulesexpresslibrouterlayer.js:95:5)
at next (C:UsersChildrenDesktopWeb ProjectsSermon_Trackernode_modulesexpresslibrouterroute.js:137:13)
at Route.dispatch (C:UsersChildrenDesktopWeb ProjectsSermon_Trackernode_modulesexpresslibrouterroute.js:112:3)
at Layer.handle [as handle_request] (C:UsersChildrenDesktopWeb ProjectsSermon_Trackernode_modulesexpresslibrouterlayer.js:95:5)
at C:UsersChildrenDesktopWeb ProjectsSermon_Trackernode_modulesexpresslibrouterindex.js:281:22
at Function.process_params (C:UsersChildrenDesktopWeb ProjectsSermon_Trackernode_modulesexpresslibrouterindex.js:335:12)
at next (C:UsersChildrenDesktopWeb ProjectsSermon_Trackernode_modulesexpresslibrouterindex.js:275:10)
at SessionStrategy.strategy.pass (C:UsersChildrenDesktopWeb ProjectsSermon_Trackernode_modulespassportlibmiddlewareauthenticate.js:343:9)
at C:UsersChildrenDesktopWeb ProjectsSermon_Trackernode_modulespassportlibstrategiessession.js:69:12
at pass (C:UsersChildrenDesktopWeb ProjectsSermon_Trackernode_modulespassportlibauthenticator.js:337:31)
at deserialized (C:UsersChildrenDesktopWeb ProjectsSermon_Trackernode_modulespassportlibauthenticator.js:349:7)
at C:UsersChildrenDesktopWeb ProjectsSermon_Trackerapp.js:71:9
at C:UsersChildrenDesktopWeb ProjectsSermon_Trackernode_modulesmongooselibmodel.js:4866:16
at C:UsersChildrenDesktopWeb ProjectsSermon_Trackernode_modulesmongooselibmodel.js:4866:16
at C:UsersChildrenDesktopWeb ProjectsSermon_Trackernode_modulesmongooselibhelperspromiseOrCallback.js:24:16

下面是错误所在的代码:

app.post("/delete", function (req, res) {
const delBut = req.body.deleteItem;
console.log(delBut);
User.find({ _id: req.user._id }, function (err, foundItemList) {
if (err) {
console.log(err);
} else {
if (foundItemList) {
for (var i = 0; i < foundItemList.length; i++) {
var itemList = foundItemList[i].items;
console.log(itemList);
itemList.forEach(function (item) {
console.log(item._id);
if (item._id == delBut) {
console.log("Found it!");
foundItemList[i].items.splice(i, 1);
console.log("Deleted it!");
console.log(itemList);
}
});
}
}
}
});
User.save(function () {
res.redirect('/workspace')
});
})

下面是完整的代码:

//jshint esversion:6
require('dotenv').config();
const express = require("express");
const bodyParser = require("body-parser");
const ejs = require("ejs");
const mongoose = require("mongoose");
const session = require('express-session');
const passport = require("passport");
const passportLocalMongoose = require("passport-local-mongoose");
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const findOrCreate = require('mongoose-findorcreate');

const app = express();
const Schema = mongoose.Schema;
app.use(express.static("public"));
app.set('view engine', 'ejs');
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(session({
secret: "Our little item.",
resave: false,
saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
const url2 = "mongodb://localhost:27017/sermontracker";
mongoose.connect(url2, { useNewUrlParser: true, useUnifiedTopology: true });
mongoose.set("useCreateIndex", true);
const userSchema = new mongoose.Schema({
fname: String,
lname: String,
email: String,
password: String,
googleId: String,
items: Array
});
const ItemSchema = new mongoose.Schema({
date: String,
loc: String,
title: String,
passage: String,
file: String
});
userSchema.plugin(passportLocalMongoose);
userSchema.plugin(findOrCreate);
const User = new mongoose.model("User", userSchema);
const Item = mongoose.model("Item", ItemSchema);
passport.use(User.createStrategy());
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});
passport.use(new GoogleStrategy({
clientID: process.env.CLIENT_ID,
clientSecret: process.env.CLIENT_SECRET,
callbackURL: "http://localhost:3000/auth/google/secrets",
userProfileURL: "https://www.googleapis.com/oauth2/v3/userinfo"
},
function (accessToken, refreshToken, profile, cb) {
console.log(profile);
User.findOrCreate({ googleId: profile.id }, function (err, user) {
return cb(err, user);
});
}
));
app.get("/", function (req, res) {
res.redirect("/home");
});
app.get("/home", function (req, res) {
res.render("home");
});
app.get("/login", function (req, res) {
res.render("login");
});
app.get("/signup", function (req, res) {
res.render("signup");
});
app.get("/workspace", function (req, res) {
User.find({ _id: req.user._id }, function (err, foundItems) {
if (err) {
console.log(err);
} else if (foundItems) {
for (var i = 0; i < foundItems.length; i++) {
res.render("workspace", { itemList: foundItems[i].items });
}
}
});

});

app.post("/workspace", function (req, res) {
const date = req.body.input1;
const location = req.body.input2;
const title = req.body.input3;
const passage = req.body.input4;
const file = req.body.input5;
const item = new Item({
date: date,
loc: location,
title: title,
passage: passage,
file: file
});
User.findById(req.user._id, function (err, foundUser) {
if (err) {
console.log(err);
} else {
if (foundUser) {
foundUser.items.push(item);
foundUser.save(function () {
res.redirect("/workspace");
});
}
}
});
});
app.get("/workspaceLight", function (req, res) {
User.find({ _id: req.user._id }, function (err, foundItems) {
if (err) {
console.log(err);
} else if (foundItems) {
for (var i = 0; i < foundItems.length; i++) {
res.render("workspaceLight", { itemList: foundItems[i].items });
}
}
});

});
app.post("/delete", function (req, res) {
const delBut = req.body.deleteItem;
console.log(delBut);
User.find({ _id: req.user._id }, function (err, foundItemList) {
if (err) {
console.log(err);
} else {
if (foundItemList) {
for (var i = 0; i < foundItemList.length; i++) {
var itemList = foundItemList[i].items;
console.log(itemList);
itemList.forEach(function (item) {
console.log(item._id);
if (item._id == delBut) {
console.log("Found it!");
foundItemList[i].items.splice(i, 1);
console.log("Deleted it!");
console.log(itemList);
}
});
}
}
}
});
User.save(function () {
res.redirect('/workspace')
});
})

app.post("/workspaceLight", function (req, res) {
const date = req.body.input1;
const location = req.body.input2;
const title = req.body.input3;
const passage = req.body.input4;
const file = req.body.input5;
const item = new Item({
date: date,
loc: location,
title: title,
passage: passage,
file: file
});
User.findById(req.user._id, function (err, foundUser) {
if (err) {
console.log(err);
} else {
if (foundUser) {
foundUser.items.push(item);
foundUser.save(function () {
res.redirect("/workspaceLight");
});
}
}
});
});
app.get("/logout", function (req, res) {
req.logout();
res.redirect("/home");
});
app.post("/logout", function (req, res) {
req.logout();
res.redirect("/home");
});
app.post("/signup", function (req, res) {
User.register({ username: req.body.username, fname: req.body.firstName, lname: req.body.lastName }, req.body.password, function (err, user) {
if (err) {
console.log(err);
res.redirect("/signup");
} else {
passport.authenticate("local")(req, res, function () {
res.redirect("/workspace");
});
}
});
});
app.post("/login", function (req, res) {
const user = new User({
username: req.body.username,
password: req.body.password
});
req.login(user, function (err) {
if (err) {
console.log(err);
} else {
passport.authenticate("local")(req, res, function () {
res.redirect("/workspace");
});
}
});
});

app.listen(3000, function () {
console.log("Server started on port 3000.");
});

我如何保存文档或模式后,我已经拼接了一个项目从数组?

你试图在modal上调用save方法,但你应该在modal实例上调用它。

for (var i = 0; i < foundItemList.length; i++) {
var itemList = foundItemList[i].items;
console.log(itemList);
itemList.forEach(function (item) {
console.log(item._id);
if (item._id == delBut) {
console.log("Found it!");
foundItemList[i].items.splice(i, 1);
console.log("Deleted it!");
console.log(itemList);
}
});
foundItemList[i].save(); // <---- save this
}

当你退出循环

res.redirect('/workspace')

在这种情况下使用async-await会更好。


编辑:添加async-await版本。我还没有测试,请在你那边测试一下。

// adding async keyword
app.post("/delete", async function (req, res) {
const delBut = req.body.deleteItem;
console.log(delBut);
try {
let foundItemList = await User.find({ _id: req.user._id });
if (foundItemList && foundItemList.length) {
for (var i = 0; i < foundItemList.length; i++) {
var itemList = foundItemList[i].items;
console.log(itemList);
for(let item of itemList) {
console.log(item._id);
if (item._id == delBut) {
console.log("Found it!");
foundItemList[i].items.splice(i, 1);
console.log("Deleted it!");
console.log(itemList);
}
}
await foundItemList[i].save(); // <---- save this
}
}
} catch (error) {
console.error(error);
}
res.redirect('/workspace');
})

最新更新