node.js - nodejs express应用程序中使用的mongodb mongoose中的错误:使用module.exports时不写入数据库
问题描述
我已经使用 express generator 成功生成并启动了一个 nodejs 应用程序。这部分是可以的。我还创建了 mongoDB 设置的独立(单个 .js 文件)原型(使用 mongoose - 对我来说是第一次)。好的
他们做得很好,但是当我结合 2 时我被卡住了。我认为我的错误出在 module.exports 的语句中,但我不知道如何解决它。有人可以帮我重写吗?注意我使用“mongoose”:“~5.3.16”,(......如果版本很重要?)我的代码(我跳过了一些长部分):/bin/www(仅供参考,可能不是问题):
var app = require('../app');
var debug = require('debug')('api-dfv2:server');
var http = require('http');
const loadConfig = require('../public/javascripts/loadConfig.js');
const config = loadConfig.getConfig();
var port = normalizePort(config.port);
app.set('port', port);
var server = http.createServer(app);
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
function normalizePort(val) {(I skip...)
}
function onError(error) {(I skip here some code to handle errors+event listener for http server "listening" event...)
应用程序.js:
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var loadConfig = require('./public/javascripts/loadConfig.js');
var Conversation = require('./src/conversation');//declared but never read probably something wrong there
//the routers we need
var indexRouter = require('./routes/index');
var dfv2Router = require('./routes/dfv2');
//initiate express with moment
var app = express();
//link with moment module
app.locals.moment = require('moment');
// view engine setup
app.set('views', path.join(__dirname, 'views'));
//app.set('view engine', 'jade');>>upgrade to pug
app.set('view engine', 'pug');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
//let's load the initial config (or defaults)
//it will exit if no credentials are provided.
loadConfig.setConfig();
/**
* map the routes
*/
app.use('/', indexRouter);
app.use('/dfv2', dfv2Router);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
在 dfv2.js 中,我收到来自聊天系统的 POST 请求,我想将该内容存储在 mongoDB 中:
var express = require('express');
var router = express.Router();
const conversation = require('../src/conversation')
/* POST received from chat system */
router.post('/', function(req, res, next) {
dialogflowv2.getDFResponse(req.body)//I generate the answer to the chat
.then((DFanswer) => {
console.log(JSON.stringify(DFanswer));//not a nice way to debug but it works until that point
var currentConversation = new conversation;
console.log('test5');
currentConversation = {"moment": "test"};//I should write the full mapping with the body etc. here just to test one field
console.log(JSON.stringify(currentConversation));
currentConversation.save() // THIS IS WHERE IT GOES WRONG XXXXXX
//.then(function(tmp) {console.log("ok : ",tmp)})
//.catch(function() {console.log("DB error :")})
res.status(200).json(DFanswer);
})
.catch(err => res.status(400).json(JSON.stringify(err.message)))
})
module.exports = router;
有关信息,conversation.js
var mongoose = require('mongoose');
const server = '127.0.0.1:27017'; // DB SERVER
const database = 'test_laurent'; // DB NAME
mongoose.connect(`mongodb://${server}/${database}`,{useNewUrlParser: true})
.then(() => {
console.log('Database connection successful - system ready')
})
.catch(err => {
console.error('Database connection error')
})
//get mongoose to use the global promise library
mongoose.Promise = global.Promise;
var db = mongoose.connection;
//to bind error of DB with console
db.on('error',console.error.bind(console, 'MongoDB connection error:'));
let mySchema = new mongoose.Schema(
{
body: String,
sessionId: String,
moment: String
})
let conversation = db.model('conversation', mySchema);
module.exports = conversation;
结果是我的数据库没有收到任何东西。但是,如果我将 conversation.js 的所有代码作为独立应用程序(POST > 生成模式 > 构造对象 > object.save > 我的集合然后在 Compass 中创建并可见,因此数据库及其连接不是问题),它会很好地工作. 提前谢谢你,欢迎任何提示。
解决方案
Conversion 是一个构造函数,但您在创建新对话时没有调用它。
做这个:-
const currentConversation = new conversation({moment: test});
.save() 也返回一个承诺,所以你必须等待它所以附加一个 .then.catch 块到 .save 方法
currentConversation.save()
.then()
.catch()
推荐阅读
- c# - Microsoft bot V4 Skill Bot 在 SendActivityAsync 函数中回复 Root bot 时响应 500(内部错误)
- python-3.x - 如果其中一个产生结果,我可以停止等待线程完成吗?
- c# - 如何使用 GTA5 的 Scripthookvdotnet 在 C# 中每秒刷新变量的值
- c# - 在 WinForms-Validating-Event 中同步异步任务
- c++ - 尝试在 Visual Studio 中构建随机项目的问题
- python - 为什么建筑系统不可用/未安装?
- asp.net-core - 无头 OrchardCMS - Grapghql 的授权问题
- angular - Angular 9 中的类成员封装
- android - 如何使用 MockK 在 Android 中测试 Kotlin 暂停调用?
- c# - 如何在 ASP.NET Core MVC 中创建具有多个图像的产品