首页 > 解决方案 > 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 中创建并可见,因此数据库及其连接不是问题),它会很好地工作. 提前谢谢你,欢迎任何提示。

标签: node.jsmongodbexpressmongoose

解决方案


Conversion 是一个构造函数,但您在创建新对话时没有调用它。

做这个:-

const currentConversation = new conversation({moment: test});

.save() 也返回一个承诺,所以你必须等待它所以附加一个 .then.catch 块到 .save 方法

currentConversation.save()
     .then()
     .catch()

推荐阅读