javascript - NodeJS - 如何使用 module.exports 从模型传递异步数据?

标签 javascript json node.js rethinkdb

我试图从 NodeJS 中的 RethinkDB 文档中获取数据,并将结果传递到我希望在模板文件中使用的变量中,但当我尝试打印时,它始终是 undefined data 变量如 #{data} (我使用的是 pug/jade),因为它是一个异步调用(我认为)。

'use strict';

var r = require('rethinkdb');

module.exports = function IndexModel() {
    data: {
        r.connect({host: '127.0.0.1', port: 28015}, function(err, conn) {
            r.db('mydb').table('mytable').run(conn).then(function(cursor) {
                cursor.toArray(function(err, result) {
                    if (err) throw err;
                    return JSON.stringify(result, null, 2);
                });
            });
        });
    }
};

我想这一定是因为nodejs希望它成为一个对象,所以我尝试像 JSON.parse(JSON.stringify(result, null, 2)) 一样解析它,但这会抛出同样的错误。

当我执行 console.log(JSON.stringify(result, null, 2)) 时,它会在错误发生后打印此信息。

[
  {
    "id": "307ad5e9-a0db-461b-a564-081d73f9b34f",
    "title": "hello"
  }
]

如果需要的话,这就是确切的错误:

Cannot read property 'length' of undefined
    at eval (eval at wrap (C:\Users\Me\Project\node_modules\pug-runtime\wrap.js:6:10), <anonymous>:248:32)
    at eval (eval at wrap (C:\Users\Me\Project\node_modules\pug-runtime\wrap.js:6:10), <anonymous>:379:4)
    at template (eval at wrap (C:\Users\Me\Project\node_modules\pug-runtime\wrap.js:6:10), <anonymous>:389:211)
    at Object.exports.renderFile (C:\Users\Me\Project\node_modules\pug\lib\index.js:427:38)
    at Object.exports.renderFile (C:\Users\Me\Project\node_modules\pug\lib\index.js:417:21)
    at View.exports.__express [as engine] (C:\Users\Me\Project\node_modules\pug\lib\index.js:464:11)
    at C:\Users\Me\Project\node_modules\engine-munger\index.js:133:22
    at C:\Users\Me\Project\node_modules\engine-munger\index.js:154:17
    at C:\Users\Me\Project\node_modules\engine-munger\index.js:87:21
    at C:\Users\Me\Project\node_modules\engine-munger\index.js:189:13
    at FSReqWrap.oncomplete (fs.js:153:5)

知道如何解决这个永恒的问题吗?谢谢!

编辑:

看来我无法从任何 rethinkdb 连接或 promise 内的 data 变量返回任何内容,它必须在其外部才能被检测到。

最佳答案

使用async/await可能适合您

mymodule.js

module.exports = async function IndexModel() {
        let conn = await r.connect({host: '127.0.0.1', port: 28015});
        let cursor = await r.db('mydb').table('mytable').run(conn)
        try {
            let arr = await cursor.toArray();
            return arr
        } catch (e) {
            throw e;
        }
}

main.js

let indexModel = require('mymodule.js');

indexModel().then(result => {
    console.log(result.length)
})

关于javascript - NodeJS - 如何使用 module.exports 从模型传递异步数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50118254/

相关文章:

comparison - Node.js 和 ZeroMQ 之间的高级差异?

javascript - URL变化无闪烁

javascript - 无法让 jQuery 链接的 ajax 选择工作

正则表达式

网页中的 JavaScript 幻灯片放映

javascript - 使用谷歌图表对 JSON API 进行 jQuery 嵌套查询

php - Facebook 页面提要不适用于 php file_get_contents()

javascript - 当 mainWindow 断开外部 HTML 时,Electron 如何加载主菜单

android - 使用服务解析json数据

node.js - 如何解决 "TypeError: process.getuid is not a function"