gpt4 book ai didi

javascript - 如何使用 Nodejs、Expressjs 和 bluebird 调用第二个 "external"函数

转载 作者:太空宇宙 更新时间:2023-11-04 02:17:44 25 4
gpt4 key购买 nike

我正在构建一个nodejs(我对此还很陌生)应用程序。我已经弄清楚如何使用 Promise 并能够从数据库中提取数据。你可以在这里看到我正在使用的代码:

myModel.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”链。

只是很难让我的大脑明白这是如何发生的......而且我一整天都在思考这个......

感谢帮助。

***** 编辑 *****

以下是我发现的有效方法:

myModel.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% 的任务。使用添加的 Promise 是解决第二个 getResults 的唯一方法。然后我从 helpers/db 中删除了 promise ,这减轻了反模式问题。

最佳答案

那么您是说您想使用第一个查询的结果作为第二个查询的参数吗?因为如果是的话,那么您需要嵌套调用。因此,不要解决第一个查询。既然这是一个可以解决的 promise ,那么它应该能够顺利实现。

这样的东西可能就是你想要的

    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);
});
}

编辑:我实际上已经研究过这个,这是一个仅使用单个 promise 的解决方案:

helpers/db.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;

myModel.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。

关于javascript - 如何使用 Nodejs、Expressjs 和 bluebird 调用第二个 "external"函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34942009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com