使用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); });
这里的变化总结:
- 在
select()
,返回promise - 在
.catch()
中的.catch()
中,重新抛出错误以使其被拒绝。 如果为.catch()
添加处理程序,并且不重新抛出或返回被拒绝的承诺,则会处理该错误,并且承诺将被parsing。 - 你需要修复你
for
循环。 它不应该在没有条件检查的for
循环中进行返回。 该代码可能是错误的(虽然我不知道你打算做什么)。 - 当你调用
db.select()
,使用.then()
处理程序来获得最终的parsing值。 - 为
db.select()
承诺添加一个error handling程序。 - 改变出口,使
db.select()
是你的function。 - 修改了您在
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这个,但它应该做的伎俩。
- 如何将带有AJAX的base64图像发送或传输到Node.js Express服务器?
- Heroku和Soundcloud API混合内容问题
- 在heroku的node.js中附加文件
- 如何使heroku停止创build一个只有工作人员的应用程序的Web进程?
- 如何在本地运行自定义时钟进程作业?
- 如何在避免Postgresql中的重复的情况下进行批量插入
- 快速自定义模块不加载在Heroku上
- parsing从Netsuite到Heroku的JSON HTTP请求会返回错误“SyntaxError:Unexpected token p”
- 部署到heroku – 未能检测到buildpack nodejs(jasonswett)