我没有要求我的s.my_movieclip.addEventListener("click", fl_MouseClickHandler.bind(s));
function fl_MouseClickHandler() {
console.log('I want banana!');
}
中的方法进入我的./db/index.js
文件来从数据库中选择数据并显示它。
server.js
是这样的:
/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
};
我正在使用Heroku,并且像这样,看着日志,终端和Slack都没有显示错误(它是一个斜杠命令)。我无法找到如何正确分离功能的帮助。如何从不同的文件中调用此'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);
});
方法和任何其他方法?
答案 0 :(得分:1)
模块中的代码是异步的。您无法直接返回值。相反,您应该返回promise,然后使用来自调用者的promise来获取最终的异步值。
有关这个一般概念的进一步讨论,请参阅以下答案:
How do I return the response from an asynchronous call?
将您的代码更改为此(请参阅嵌入式评论):
'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()
中,返回承诺.catch()
select()
中,重新抛出错误以使其成为被拒绝的承诺。如果为.catch()
添加处理程序并且不重新抛出或返回被拒绝的承诺,则会处理错误并解析承诺。for
循环。它不应该在for
循环内进行返回而不进行条件检查。那段代码可能是错的(虽然我不确定你打算做什么)。db.select()
时,请使用.then()
处理程序获取最终解决的值。db.select()
承诺添加错误处理程序。db.select()
是您的功能。for
循环中引用数据的方式,以便实际获取所需的属性。答案 1 :(得分:1)
您的代码中存在许多问题,其中一些问题已在@ jfriend00的上一个答案中列出。
我只会补充说,当方法成功时,你也不会从方法中返回任何数据。
考虑到你有多少错误,而不是重复它们,我会给你一个更正的代码示例。
数据库模块:
'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(升级,如果您有较旧的代码)。
我不会说这是组织代码的好方法,但至少它是一个有效的例子。您可以查看pg-promise-demo以获取完整的应用程序示例,以便更好地了解如何组织数据库代码。
API参考:map
答案 2 :(得分:0)
一些事情。我会确保你的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);
});
我没有对此进行测试,但它应该可以解决这个问题。