Nodejs Express应用程序 - 将MongoDb Cursor转换为JSON

时间:2017-09-25 18:16:36

标签: json node.js mongodb cursor bson

我正在运行节点v6.11.2,而我的MongoDB是版本3.4.7。 我有一个MongoDB,其中有几个用户使用passportjs注册,并且会话用于快速会话。为了渲染诸如显示名称,用户偏好等内容,我使用这样的EJS:

                    <p>
                        <strong>id</strong>: <%= user._id %><br>
                        <strong>email</strong>: <%= user.local.email %><br>
                        <strong>password</strong>: <%= user.local.password %><br>
                        <strong>Display name</strong>: <%= user.info.displayname %><br>
                        <strong>Subjects</strong>: <%= user.info.subjects %><br>
                    </p>

在呈现此ejs页面时,GET请求引用会话中的用户:

user: req.user

这不适用于我现在尝试做的事情,因为它需要用户登录。我想有一个页面,我可以显示注册用户,包括他们的显示名称,一些他们的喜好等(如公共资料)。 我已尝试(仅用于测试目的)在我的app.js文件中删除以下代码行:

console.log(db.users.find({}));

我希望这会返回我的数据库中的所有对象(如果我在我的mongo shell中运行它(没有console.log)它会这样做),而是返回一个这样的游标:

Cursor {
  _readableState:
   ReadableState {
     objectMode: true,
     highWaterMark: 0,
     buffer: BufferList { head: null, tail: null, length: 0 },
     length: 0,
     pipes: null,
     pipesCount: 0,
     flowing: null,
     ended: false,
     endEmitted: false,
     reading: false,
     sync: true,
     needReadable: false,
     emittedReadable: false,
     readableListening: false,
     resumeScheduled: false,
     defaultEncoding: 'utf8',
     ranOut: false,
     awaitDrain: 0,
     readingMore: false,
     decoder: null,
     encoding: null },
  readable: true,
  domain: null,
  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined,
  _opts: {},
  _get: [Function: thunk] }

如何将此转换为JSON? 提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我修复了如下:我在我的get请求中添加了几行代码:

User.find({}).exec(function(err, users) {
            if (err) throw err;
            res.render('mentors.ejs', {
                'users': users
            })

然后我可以按如下方式访问JSON:

<% users.forEach(function (user) { %>     
    <p><%= user.info.displayname %></p>
        <p><%= user.info.subjects %></p>                                       
<% }) %>

答案 1 :(得分:0)

您可能希望在toArray()中使用db.users.find({}).toArray()方法。这将返回用户列表而不是光标。

答案 2 :(得分:0)

这是另一个解决方案,尝试使用.toArray()实现异步,等待并转换为Promise,然后使用零数组索引([0])等待第一个输出,

要了解更多信息,请访问github:(nodejs-express-mongobd-graqhql)

[https://github.com/barakaally/nodejs-express-graphql]

示例代码 数据库连接(db.js)

const MongoClient = require("mongodb").MongoClient;
const keys = require("../keys");
class Db {
    constructor() { }

    static async con() {
        return (await MongoClient.connect("mongodb://localhost:27017/", { useUnifiedTopology: true })).db("eshop");
    }


}

module.exports = Db;

控制器使用Db连接

const Db = require("../database/db");
class AuthController {
    /**
     * @typedef  {{loginInput:{email:String,password:String}}} LoginInput
     * @param {LoginInput} userInput
     * 
     */
    static async auth(userInput) {
        return (await (await Db.con()).collection("customers").find(userInput.loginInput).toArray())[0];
    }

}

module.exports = AuthController;