使用Node.js从其他文件调用方法

我没有要求我的./db/index.js方法到我的server.js文件从数据库中select数据并显示它。

/db/index.js是这样的:

 'use strict'; const pgp = require('pg-promise')(); const pg = pgp(process.env.DATABASE_URL); let select = () => { pg.any('SELECT username, status FROM status') .then(function(data){ for (var item of data) { return item.username + "'s status is " + item.status; } }) .catch(function(err) { return 'Error: ' + err.message || err; }); }; module.exports = () => { select }; 

我想从另一个文件中调用它:

 'use strict'; const port = process.env.PORT || 3000; const bodyParser = require('body-parser'); const express = require('express'); const app = express(); const db = require('./db/'); app.use(bodyParser.urlencoded({extended: true})); app.post('/logdash', function(req, res, next) { res.status(200).send(db.select()); }); app.listen(port, function() { console.log('Server is running on port', port); }); 

我正在使用Heroku,就像这样,看着日志,terminal和Slack都没有显示错误(这是一个斜杠命令)。 我无法find如何正确分离function的帮助。 我怎样才能从另一个文件调用这个select方法和其他的方法?

你的代码有很多问题,其中一些在@ jfriend00的前一个答案中列出。

我只会补充说,在成功的时候你也不会从方法中返回任何数据。

考虑到你有多less错误,而不是重复它们,我会给你一个更正的代码示例。

数据库模块:

 'use strict'; const pgp = require('pg-promise')(); const db = pgp(process.env.DATABASE_URL); let select = (req, res, next) => db.map('SELECT username, status FROM status', null, row=> { return row.username + "'s status is " + row.status; }) .then(data=> { res.status(200).send(data); }) .catch(err=> { res.status(500).send(err.message || err); }); module.exports = { select }; 

和HTTP服务文件:

 'use strict'; const port = process.env.PORT || 3000; const bodyParser = require('body-parser'); const express = require('express'); const app = express(); const db = require('./db/'); app.use(bodyParser.urlencoded({extended: true})); app.post('/logdash', db.select); app.listen(port, function () { console.log('Server is running on port', port); }); 

代码基于pg-promise v.4.3.x(升级,如果你有一个更旧的)。

我不会说这是一个很好的方法来组织你的代码,但至less这是一个工作的例子。 您可以查看pg-promise-demo了解完整的应用程序示例,以便您更好地了解如何组织数据库代码。


API参考: 地图


模块中的代码是asynchronous的。 你不能直接返回一个值。 相反,您应该返回承诺,然后使用调用方的承诺来获取最终的asynchronous值。

有关这个一般概念的进一步讨论,请看这个答案:

如何返回来自asynchronous调用的响应?

将您的代码更改为此(请参阅embedded的注释):

 'use strict'; const pgp = require('pg-promise')(); const pg = pgp(process.env.DATABASE_URL); let select = () => { // return the promise here return pg.any('SELECT username, status FROM status') .then(function(data){ return data.map(function(item) { return item.username + "'s status is " + item.status; }); }) .catch(function(err) { // to keep this an error, we have to rethrow the error, otherwise // the rejection is considered "handled" and is not an error throw 'Error: ' + err.message || err; }); }; // export the function module.exports.select = select; 

并像这样调用它:

 'use strict'; const port = process.env.PORT || 3000; const bodyParser = require('body-parser'); const express = require('express'); const app = express(); const db = require('./db/'); app.use(bodyParser.urlencoded({extended: true})); app.post('/logdash', function(req, res, next) { db.select().then(function(data) { res.status(200).json(data); }).catch(function(err) { // add some sort of error response here res.status(500).json(err); }); }); app.listen(port, function() { console.log('Server is running on port', port); }); 

这里的变化总结:

  1. select() ,返回promise
  2. .catch()中的.catch()中,重新抛出错误以使其被拒绝。 如果为.catch()添加处理程序,并且不重新抛出或返回被拒绝的承诺,则会处理该错误,并且承诺将被parsing。
  3. 你需要修复你for循环。 它不应该在没有条件检查的for循环中进行返回。 该代码可能是错误的(虽然我不知道你打算做什么)。
  4. 当你调用db.select() ,使用.then()处理程序来获得最终的parsing值。
  5. db.select()承诺添加一个error handling程序。
  6. 改变出口,使db.select()是你的function。
  7. 修改了您在for循环中引用数据的方式for以便实际获取所需的属性。

一些东西。 我会确保你的select函数返回一个Promise。 我也会处理你的路线的承诺。 这样你可以正确地发送适当的状态码和响应。

db/index.js

 'use strict'; const pgp = require('pg-promise')(); const pg = pgp(process.env.DATABASE_URL); let select = () => { return pg.any('SELECT username, status FROM status') } module.exports = () => { select }; 

server.js

 'use strict'; const port = process.env.PORT || 3000; const bodyParser = require('body-parser'); const express = require('express'); const app = express(); const db = require('./db/'); app.use(bodyParser.urlencoded({extended: true})); app.post('/logdash', function(req, res, next) { db.select() .then((data) => { res.status(200).json(data) }) .catch((error) => { res.status(500).json(error) }) }); app.listen(port, function() { console.log('Server is running on port', port); }); 

我没有testing这个,但它应该做的伎俩。