如何使用 Nodejs、Expressjs 和 bluebird 调用第二个“外部”函数
How do you call a second "external" function using Nodejs, Expressjs and bluebird
我正在构建一个nodejs(我很陌生)应用程序。 我已经弄清楚了使用承诺,并且能够从数据库中提取数据。 您可以在此处看到我正在使用的代码:
我的模型.js
var express = require('express');
var app = express();
var Promise = require("bluebird");
var mysql = require('../helpers/db');
// handle a get request
exports.post = function(params, callback)
{
function getData()
{
return new Promise(function(resolve, reject)
{
mysql.getResults('select id from someTable',function(err, rows)
{
resolve(rows);
});
});
}
function getMoreData()
{
return new Promise(function(resolve, reject)
{
mysql.getResults('select * from anotherTable',function(err, rows)
{
resolve(rows);
});
});
}
getData().then(
function(data)
{
console.log(data); // Log the value once it is resolved
return data;
})
).then(
function(d)
{
console.log(d);
}
).catch(
function(err)
{
console.log(err)
}
);
}
../helpers/db.js
var mysql = require('mysql');
var Promise = require('bluebird');
pool = mysql.createPool({
connectionLimit: 10,
database : 'XXXXXX',
port : 3306,
host : 'localhost',
user : 'XXXXXX',
password : 'XXXXXX'
});
var executeQuery = Promise.promisify(function executeQuery(query, callback) {
pool.getConnection(function (err, connection) {
if (err) {
return callback(err, null);
}
else if (connection) {
connection.query(query, function (err, rows, fields) {
connection.release();
if (err) {
return callback(err, null);
}
return callback(null, rows);
})
}
else {
return callback("No connection", null);
}
});
})
var getResults = Promise.promisify(function getResult(query,callback) {
executeQuery(query, function (err, rows) {
if (!err) {
callback(null,rows);
}
else {
callback(true,err);
}
});
})
exports.getResults = getResults;
这一切都很好用。 现在,如果我还想从函数getMoreData中提取数据怎么办? 目标是使用getData中的数据来查询getMoreData中的数据,并将结果推到"then"链的更远处。
只是很难让我的大脑弄清楚这将如何发生.....我整天都在敲打我的头......
感谢帮助。
*****编辑*****
这是我发现有效的方法:
我的模型.js
var express = require('express');
var app = express();
var Promise = require("bluebird");
var mysql = require('../helpers/db');
// handle a get request
exports.post = function(params, callback)
{
return new Promise(function(resolve, reject)
{
mysql.getResults('select id from sometable order by id', function(err, rows1)
{
// console.log(rows1[0]);
mysql.getResults('select field1, field2 from someothertable where id=' + rows1[0].id, function(err, rows2)
{
resolve(rows2);
});
})
}).then(function (params)
{
callback(null, params);
});
}
../helpers/db.js
var mysql = require('mysql');
var Promise = require('bluebird');
pool = mysql.createPool({
connectionLimit: 10,
database : 'XXXXX',
port : 3306,
host : 'localhost',
user : 'XXXXX',
password : 'XXXXX'
});
var executeQuery = function executeQuery(query, callback) {
pool.getConnection(function (err, connection) {
if (err) {
return callback(err, null);
}
else if (connection) {
connection.query(query, function (err, rows, fields) {
connection.release();
if (err) {
return callback(err, null);
}
return callback(null, rows);
})
}
else {
return callback("No connection", null);
}
});
}
var getResults = function getResult(query,callback)
{
executeQuery(query, function (err, rows)
{
if (!err)
{
callback(null,rows);
}
else
{
callback(true,err);
}
});
}
exports.getResults = getResults;
接受了答案,因为它让我完成了 90% 的路程。 使用添加的承诺是解决第二个 getResults 的唯一方法。 然后我从助手/db 中删除了承诺,这缓解了反模式问题。
那么,您是说要将第一个查询的结果用作第二个查询的参数吗?因为如果你是,那么你需要嵌套调用。因此,不要解析第一个查询。由于这是一个可以解决的承诺,那么它应该可以正常工作。
像这样的东西可能是你想要的
exports.post = function (params, callback) {
mysql.getResults('select id from someTable', function (err, rows1) {
mysql.getResults('select * from anotherTable', function (err, rows2) {
resolve(rows2);
});
}).then(function (params, etc) {
console.log(params);
});
}
编辑:我实际上已经看过这个,这是一个仅使用一个承诺的解决方案:
助手/数据库.js
var mysql = require('mysql');
var Promise = require('bluebird');
pool = mysql.createPool({
connectionLimit: 10,
database : 'XX',
port : 3306,
host : 'XX',
user : 'XX',
password : 'XX'
});
var executeQuery = function (query, callback) {
pool.getConnection(function (err, connection) {
if (err) {
return callback(err, null);
}
else if (connection) {
connection.query(query, function (err, rows, fields) {
connection.release();
if (err) {
return callback(err, null);
}
return callback(null, rows);
})
}
else {
return callback("No connection", null);
}
});
}
var getResults = function (query,callback) {
return executeQuery(query, function (err, rows) {
if (!err) {
callback(null,rows);
}
else {
callback(true,err);
}
});
}
exports.getResults = getResults;
我的模型.js
var express = require('express');
var app = express();
var Promise = require("bluebird");
var mysql = require('../helpers/db');
// handle a get request
exports.post = function (params, callback) {
function getData(){
return new Promise(function (resolve,reject){
mysql.getResults('select username from user', function (err, rows1) {
mysql.getResults("select * from user where username = '" + rows1[0].username + "'", function (err, rows2) {
resolve(rows2);
})
});
});
}
getData()
.then(function (params, etc) {
console.log('params',params);
});
}
编辑2:我刚刚注意到您已经更新了您的问题以显示答案 - 与我的相同。所以+1
相关文章:
- 下拉选择可自动更改第二个下拉选择
- 为什么不'在JQuery中找到第二个css选择器的工作
- 当单击第一个李时,它显示内容一,当单击第二个李时,它显示内容二
- CORS-重定向到第二个GET正在接收的页面
- 正则表达式与数字中的第二个点匹配
- 如何在react js中移动第二个组件
- 使用Javascript,如何显示<tr>在另一<tr>悬停时,隐藏第二个<tr>
- 关闭第二个事件源上的第一个事件源's onopen方法
- D3从嵌套的JSON中绘制第二个圆环图
- IE11中的第二个调用取消了第一个Fetch API调用
- 第一个字第一个字符第二个字第二个字符,一直到数组结束
- 角度指令:指向第二个元素
- 时间选择器:如何通过更改第一个值来更改第二个值
- 我如何从字符串中选出第一个单词的第一个字母,然后再选出第二个单词
- 与网络界面相比,谷歌搜索API有时会重复第一个结果,有时会重复第二个结果
- 第二个存在条件不起作用
- 从第一个日期选择器定义第二个日期选择器的开始日期
- 如果未选择第一个下拉列表,则禁用第二个下拉列表
- 两个javascript函数,第二个等待第一个使用getScript从外部URL检索值
- 如何使用 Nodejs、Expressjs 和 bluebird 调用第二个“外部”函数