NodeJS - 如何从具有 module.exports 的模型传递异步数据?
NodeJS - how to pass async data from a model with module.exports?
我试图从 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)
知道如何解决这个永恒的问题吗?谢谢!
编辑:
看来我无法 return 任何 rethinkdb 连接或承诺中的 data
变量中的任何内容,它必须在它之外才能被检测到。
尝试用这个替换您的代码:
const r = require('rethinkdb');
module.exports = function indexModel() {
return new Promise((resolve, reject) => {
const params = {
host: '127.0.0.1',
port: 28015
};
r.connect(params, (err, conn) => {
// check availability
if (error) return reject(error);
r.db('mydb')
.table('mytable')
.run(conn)
.then(cursor => {
cursor.toArray((error, result) => {
if (error) return reject(error);
const data = JSON.stringify(result, null, 2);
return resolve({
data: 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)
})
我试图从 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)
知道如何解决这个永恒的问题吗?谢谢!
编辑:
看来我无法 return 任何 rethinkdb 连接或承诺中的 data
变量中的任何内容,它必须在它之外才能被检测到。
尝试用这个替换您的代码:
const r = require('rethinkdb');
module.exports = function indexModel() {
return new Promise((resolve, reject) => {
const params = {
host: '127.0.0.1',
port: 28015
};
r.connect(params, (err, conn) => {
// check availability
if (error) return reject(error);
r.db('mydb')
.table('mytable')
.run(conn)
.then(cursor => {
cursor.toArray((error, result) => {
if (error) return reject(error);
const data = JSON.stringify(result, null, 2);
return resolve({
data: 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)
})