通过仅表达返回路径请求mongo数据库

时间:2017-03-14 13:32:42

标签: javascript angularjs mongodb express

我一直在研究这个websocket函数,它调用mongodb返回一些我用' get'存储的数据。

const User = require('mongoose');
const express = require('express');
const cal = require('../../app/models/data.server.model.js');
const d = require('../../app/routes/data.server.routes.js');
const data = require('./data.server.controller');

module.exports = function(app) {
require('express-ws')(app);


app.ws('/', function (ws, req) {                                                    //webSocket callback function
    ws.on('message', function (msg) {
        console.log("Message received from client: %s", msg);
        if (msg == "Update" || msg == "update") {

            const calendar = app.route('/api/data').get();                 //Query mongoose, return events.

            console.log(calendar);
            ws.send("fromJSON " + JSON.stringify(calendar));

        }
    });
});

};

此路线使用此功能:

module.exports = function(app) {
  app.route('/api/data')
     .get(data.list)
     .post(users.requiresLogin, data.create);

最后应该致电:

exports.list = function(req, res) {
  Data.find().sort('-created').populate('creator', 'firstName lastName fullName').exec((err, datas) => {
    if (err) {
      return res.status(400).send({
        message: getErrorMessage(err)
      });
    } else {
      res.status(200).json(datas);
    }
  });
};

并返回我的数据。

然而,我所有人都参与了变量'日历'是一个带有'路径的JSON对象(它是相同的路径 - ' api / data'),' stack' &安培; '方法'这是空的。

我知道数据存在,因为我可以使用一些AngularJS代码访问它,但我不太清楚如何在这里访问它。任何帮助将不胜感激,如果我在任何地方有点模糊,请告诉我。提前谢谢!

1 个答案:

答案 0 :(得分:2)

问题是您正在尝试使用异步方法,如同步方法。当您发送WS消息时,您实际上还没有数据。

我不确定它是否是调用路由处理程序的最佳选择。我将代码更改为以下内容:

...
// In your model static methods you can do a method that will return data
// You use arrow function, so ES6 is okay. Then you can use Promises 
// to avoid callbacks. Mongoose supports Promises by default.
// 
getData () {
    return this
        .find()
        .sort('-created')
        .populate('creator', 'firstName lastName fullName')
        .exec();
}

然后list方法将如下所示:

exports.list = (req, res) => {
    Data
        .getData()
        .then(data => res.status(200).json(data))
        .catch(err => {
            res.status(400).send({
                message: getErrorMessage(err)
            });
        })
}

对于WebSockets,您可以从模型中调用方法:

app.ws('/', function (ws, req) {                                                    //webSocket callback function
ws.on('message', function (msg) {
    console.log("Message received from client: %s", msg);
    if (msg == "Update" || msg == "update") {

        Data
           .getData()
           .then(data => {
               console.log(data);
               ws.send("fromJSON " + JSON.stringify(calendar));
           })
           .catch(/*Handle errors here*/);

    }
});

});

或者您可以直接致电Data.find().sort('-created')...而不是将其包装到方法中。