这是对我正在做的事情的简单解释。首先,我接受最终用户的GET请求。其次,我将一个(我现在正在发出GET请求)参数从get请求传递给异步函数,该异步函数根据参数返回用户的电子邮件地址(本质上是一个虚荣网址。" Bob&# 34; vs" Robert Richardson")。
第三,我正在向更多的GET请求发送到第二个系统,该系统返回包含关于用户的不同花絮的JSON文件。
我知道标注工作正常,因为我可以使用我手动传递所需信息的函数运行node index.js
,并返回所需的结果。但是,当我启动我的nodejs服务器,并尝试响应传入的GET请求(我测试,绝对不是直播)时,我得到了非常奇怪的结果......
这就是我现在想要的工作: //server.js const express = require(' express'); const bodyParser = require(' body-parser'); const app = express(); const port = 8000;
app.use(bodyParser.urlencoded({
extended: true
}));
require('./app/routes')(app, {});
app.listen(port, () => {
console.log('test is listening on port :: ' + port);
});
//routes.js
const getdata = require('./getData '); //contains function for GET request one to convert param to email
async function getReturn(app, db) {
app.get('/getDataFrom/:alias', (req, res) => {
const alias = req.params.alias;
console.log('alias : ' + alias);
getEmailFromPromise(alias);
});
}
async function getEmailFromPromise(alias) {
console.log('getting email');
let output = await getEmail(alias);
console.log('output :: ' + output);
// return output;
}
function getEmail() {
return new Promise(resolve => {
let email = getdata.getUserInfo(alias);
resolve(email);
}, 1000);
}
值得注意的是,JS和Node并不是我常用的代码,但是我需要为我正在帮助的项目提供帮助。我可以得到简单的例子,但不是我的请求。
传入GET:localhost:8000 / getDataFrom / bob
以上内容将返回以下内容:
test is listening on port :: 8000
alias : rrichardson
getting email
output :: undefined //I am wanting this to log after I actually get the email
email found :: robert.richardson@company.com //I do get this back, but out of order. The undefined above should also be this
另一个文件,如果有帮助(正确导出):
//this is callout one getData
async function getUserInfo(alias){
client.connect();
client.query('select email, firstname, lastname from salesforce.user WHERE
alias = \''+ alias + '\'', (err, res) => {
if (err) console.log('err :: ' + err);
// console.log(res.rows);
client.end();
var email = res.rows[0].email;
if(email != null){
console.log('email found :: ' + email);
return email;
}
else return 'No Email Found';
});
}
显然我遗漏了我的凭据,但是当我将特定数据传入其中时,最后一个js文件的工作正常。再次,只是在尝试响应传入我的GET请求时出现问题。我真的很感激任何帮助清除这一点。我很确定我可以得到第二个GET请求,如果我能得到一些帮助来弄清楚第一个。
谢谢!
答案 0 :(得分:1)
您需要getReturn
才能返回getEmailFromPromise
来电产生的承诺。由于app.get
使用的是回调而不是承诺,因此您必须先将其明确转换为承诺 - 在这种情况下,getReturn
异步不会有太大用处。< / p>
function getReturn(app, db) {
return new Promise((resolve) => {
app.get('/getDataFrom/:alias', (req, res) => {
const alias = req.params.alias;
console.log('alias : ' + alias);
getEmailFromPromise(alias)
.then(resolve);
});
});
}
另一个问题是,getUserInfo
还使用回调而非承诺 - 您无法将其转换为async
函数,您可以必须明确地将其转换为返回Promise:
function getUserInfo(alias){
return new Promise((resolve, reject) => {
client.connect();
client.query('select email, firstname, lastname from salesforce.user WHERE
alias = \''+ alias + '\'', (err, res) => {
if (err) {
console.log('err :: ' + err);
reject(err);
}
// console.log(res.rows);
client.end();
var email = res.rows[0].email;
if(email != null){
console.log('email found :: ' + email);
resolve(email);
}
else resolve('No Email Found');
});
});
}
如果您希望以下行仅在承诺解决后运行,您还需要使用await
来使用承诺:
function getEmail() {
return new Promise(resolve => {
let email = await getdata.getUserInfo(alias);
但如果您只是立即解决问题,那么对await
某事作出承诺并没有多大意义。 (你在getEmail
,1000
中提供给承诺的第二个论点,没有任何意义)
只需返回承诺本身:
function getEmail() {
return getdata.getUserInfo(alias);
}
答案 1 :(得分:1)
function getUserInfo(alias){
return new Promise(function(resolve, reject){
client.connect();
client.query('select email, firstname, lastname from salesforce.user WHERE alias = \''+
alias + '\'', (err, res) => {
if (err) reject('err :: ' + err);
// console.log(res.rows);
client.end();
var email = res.rows[0].email;
if(email != null){
console.log('email found :: ' + email);
resolve(email);
}
else reject('No Email Found');
});
}
}
并称之为:
function getEmail() {
return new Promise(resolve => {
getdata.getUserInfo(alias).then(function(email){
resolve(email);
});
});
}