express - Express/Node/Mongoose:为什么 find() on collection 在我的 router.js 中失败?
问题描述
当我尝试在我的 Mongo 集合(使用 ExpressJS/Mongoose)上执行“find”或“findOne”时,出现错误:“TypeError: _Cardsets.Cardset.find(...).forEach is not a function”(注意集合名称的两倍,在数据库中被命名为“cardsets”(小写和复数)。
来自 app.js
import express from 'express';
import path from 'path';
import cookeParser from 'cookie-parser';
import bodyParser from 'body-parser';
import ejs from 'ejs';
import expressValidator from 'express-validator';
import flash from 'connect-flash';
import session from 'express-session';
import passport from 'passport';
const LocalStrategy = require('passport-local').Strategy;
import mongoose from 'mongoose';
import index from './routes/index';
import users from './routes/users';
import mysets from './routes/mysets';
var ensureLoggedIn = require('connect-ensure-login').ensureLoggedIn;
[...]
mongoose.Promise = global.Promise;
mongoose.connect('mongodb://localhost/CRMDB', {
useMongoClient: true
});
let db = mongoose.connection;
db.on("error", function (error) {
console.log("fail--->" + error);
});
db.on("open", function () {
console.log("connected");
});
const app = express();
const PORT = 3000;
[...]
app.use('/mysets/',mysets);
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
来自 ./models/Cardsets.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const CardsetSchema = new Schema({
_id: String,
setTitle: String,
minScore: Number,
[...]
dateModified: Date,
results: Array
});
export const Cardset = mongoose.model('Cardset', CardsetSchema);
来自 ./routes/mysets.js
import express from 'express';
let router = express.Router();
import { Cardset } from '../models/Cardsets';
router.get('/', function(req, res){
var id = req.user._id;
var dataset = [];
Cardset.find({creator: id}).forEach(function(myDoc) {
var tempData = {};
tempData.setTitle = myDoc.setTitle;
tempData._id = myDoc._id;
tempData.language = myDoc.language;
tempData.dateCreated = myDoc.dateCreated;
dataset.push(tempData);
});
console.log("dataset = "+dataset);
res.render('pages/mysets', {
dataset: dataset
});
});
export default router;
我希望能够将从 mongo 文档创建的数据对象传递到客户端页面。
解决方案
我认为,您应该在代码中使用如下承诺:
router.get('/', function(req, res){
var id = req.user._id;
var dataset = [];
Cardset.find({creator: id}).then((Docs) => {
Docs.forEach((myDoc) => {
var tempData = {};
tempData.setTitle = myDoc.setTitle;
tempData._id = myDoc._id;
tempData.language = myDoc.language;
tempData.dateCreated = myDoc.dateCreated;
dataset.push(tempData);
});
});
console.log("dataset = "+dataset);
res.render('pages/mysets', {
dataset: dataset
});
});
推荐阅读
- vector - 基于其他向量值的数学计算在 R 中填充新向量
- wordpress - 将 Bootstrap 4 JS 导入项目
- javascript - 智能在 VS Code 中不适用于 Gsap
- python - 从 R 的 system() 调用 python:找不到熊猫
- python - 使用 ElementTree 从 XML 中获取值
- javascript - 在多构建 Vue js 应用程序中定义多个配置的最佳方法是什么?
- html - 使用 HTML 和 css 使整个形状可点击
- python - 尝试使用 tkinter 网格创建数独游戏,GUI 网格出现问题
- javascript - 如何计算动画 gif 循环的次数并在 javascript 中显示该计数?
- android - 获取 java.io.IOException:当我从一个片段导航到另一个片段时取消