Node.js NodeJ需要多个脚本同步执行
我是一个NodeJS和Stack Overflow新手,所以我希望你不会觉得这个问题有侮辱性:) 我创建了几个脚本,帮助我自动化日常工作(整合不同供应商的价格和库存)。Node.js NodeJ需要多个脚本同步执行,node.js,Node.js,我是一个NodeJS和Stack Overflow新手,所以我希望你不会觉得这个问题有侮辱性:) 我创建了几个脚本,帮助我自动化日常工作(整合不同供应商的价格和库存)。 现在我需要按顺序执行代码,以便在启动主“app.js”文件时脚本(独立的.js文件)一个接一个地执行。我已尝试“嵌套”所有函数,但不起作用。 我已经找了两天的解决方案,不能再在一个循环中运行了,所以我希望有更多经验的人能帮助我 var myConfig1 = require('./first.js'); var myConfig
现在我需要按顺序执行代码,以便在启动主“app.js”文件时脚本(独立的.js文件)一个接一个地执行。我已尝试“嵌套”所有函数,但不起作用。
我已经找了两天的解决方案,不能再在一个循环中运行了,所以我希望有更多经验的人能帮助我
var myConfig1 = require('./first.js');
var myConfig2 = require('./second.js');
var myConfig3 = require('./third.js');
myConfig1.one();
myConfig2.two();
myConfig3.three();
所以当我运行第二个脚本时,首先运行第一个脚本。。。我知道这是由于nodeJS的异步特性造成的,但我不能让它正常工作
来自first.js的代码
exports.one = function(){
let mysql = require('mysql');
var fs = require('fs');
let connection = mysql.createConnection({
host: '///',
user: '///',
password: '///',
database: '///'
});
connection.connect(function(err) {
if (err) throw err;
connection.query("SELECT * FROM `2UyqqIA_postmeta` WHERE `meta_key` LIKE '_sku'", function (err, results) {
if (err) throw err;
fs.writeFile('sku.json', JSON.stringify(results), function (err) {
if (err) throw err;
console.log('SKU Saved!');
});
});
connection.query("SELECT * FROM `2UyqqIA_postmeta` WHERE `meta_key` LIKE '_stock'", function (err, results) {
if (err) throw err;
fs.writeFile('stock.json', JSON.stringify(results), function (err) {
if (err) throw err;
console.log('Stock Saved!');
});
});
connection.query("SELECT * FROM `2UyqqIA_postmeta` WHERE `meta_key` LIKE '_price'", function (err, results) {
if (err) throw err;
fs.writeFile('price.json', JSON.stringify(results), function (err) {
if (err) throw err;
console.log('Price Saved!');
});
connection.end(function(err) {
// The connection is terminated now
});
});
});
}
second.js
exports.two = function(){
const mongodb = require('mongodb')
var MongoClient = mongodb.MongoClient
const url = 'mongodb://127.0.0.1:27017'
const databaseName = 'products'
var fs = require('fs')
fs.readFile('./sku.json', 'utf8', function (err, data) {
if (err) throw err;
var json = JSON.parse(data);
console.log(json.length)
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("mydb");
for(var k = 0; k < json.length; k++){
var myquery = { post_id: json[k].post_id };
var newvalues = { $set: {_id: json[k].post_id, sku: String(json[k].meta_value) } };
dbo.collection("products").updateOne(myquery, newvalues, { upsert:true }, function(err, res) {
if (err) throw err;
db.close();
});
}
console.log("SKU updated");
});
})
fs.readFile('./price.json', 'utf8', function (err, data) {
if (err) throw err;
var json = JSON.parse(data);
console.log(json.length)
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("mydb");
for(var k = 0; k < json.length; k++){
var myquery = { post_id: json[k].post_id };
var newvalues = { $set: {_id: json[k].post_id, price: Number(json[k].meta_value) } };
dbo.collection("products").updateOne(myquery, newvalues, { upsert:true }, function(err, res) {
if (err) throw err;
db.close();
});
}
console.log("Price updated");
});
})
fs.readFile('./stock.json', 'utf8', function (err, data) {
if (err) throw err;
var json = JSON.parse(data);
console.log(json.length)
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("mydb");
for(var k = 0; k < json.length; k++){
var myquery = { post_id: json[k].post_id };
var newvalues = { $set: {_id: json[k].post_id, quantity: Number(json[k].meta_value) } };
dbo.collection("products").updateOne(myquery, newvalues, { upsert:true }, function(err, res) {
if (err) throw err;
db.close();
});
}
console.log("Qty updated");
});
})
}
exports.two=函数(){
const mongodb=require('mongodb')
var MongoClient=mongodb.MongoClient
常量url=mongodb://127.0.0.1:27017'
const databaseName='products'
var fs=require('fs')
fs.readFile('./sku.json',utf8',函数(err,data){
如果(错误)抛出错误;
var json=json.parse(数据);
log(json.length)
连接(url,函数(err,db){
如果(错误)抛出错误;
var dbo=db.db(“mydb”);
for(var k=0;k
假设这三个函数是异步函数。你有两个选择
使用async/await
(async() => {
await myConfig1.one();
await myConfig2.two();
await myConfig3.three();
})();
使用。然后使用
进行承诺
myConfig1.one()
.then(() => myConfig2.two())
.then(() => myConfig3.three());
这意味着您正在等待第一个功能完成,然后再转到下一个功能。假设这三个函数都是异步函数,希望这对您有所帮助。你有两个选择 使用
async/await
(async() => {
await myConfig1.one();
await myConfig2.two();
await myConfig3.three();
})();
使用。然后使用
进行承诺
myConfig1.one()
.then(() => myConfig2.two())
.then(() => myConfig3.three());
这意味着您正在等待第一个功能完成,然后再转到下一个功能。希望这有帮助您能在所需文件中显示一些代码吗?这将取决于
first.js
、second.js
和third.js
的内部内容-我们需要查看更多代码来提供帮助。当然,我已经添加了前2个.js文件。总共有10个,但我认为通过3个例子,我可以找到一个可行的解决方案。我认为您应该在使用fs
的地方返回承诺,然后等待解决。谢谢!我将使用Ashish Modi示例,何时/如果我能使其发挥作用,将在这里进一步阐述。您能否在所需文件中显示一些代码?这将取决于first.js
、second.js
和third.js
的内部内容-我们必须查看更多代码以提供帮助。当然,我已经添加了前2.js文件。总共有10个,但我认为通过3个例子,我可以找到一个可行的解决方案。我认为您应该在使用fs
的地方返回承诺,然后等待解决。谢谢!我将使用Ashish Modi的例子,我将在这里详细说明何时/如果我让它起作用。不幸的是,它不起作用。那么,在async/await版本中,它在第一个函数生成所需的.json文件之前启动第二个函数,因此失败。In.then version-无法读取undefined的属性“then”。@PrincessMo这是一种方法-但您需要在这些函数中返回一个承诺-因此,请将这些回调封装到承诺中,或检查dock中是否有基于承诺的approach@Estradiaz你认为我应该研究变种2?(with.then)@princessMoo我的意思是你需要exports.one=function(){return/*a promsie*/…}
即使这样也不行。它抛出一个“Error:enoint:no-this-file或directory,open./sku.json”,因为第二个脚本在第一个脚本完成并生成这些文件之前开始运行。这需要一段时间才能弄清楚。有了C和Python的背景,我觉得这就像科幻小说:)不幸的是,它不起作用。那么,在async/await版本中,它在第一个函数生成所需的.json文件之前启动第二个函数,因此失败。In.then version-无法读取undefined的属性“then”。@PrincessMo这是一种方法-但您需要在这些函数中返回一个承诺-因此,请将这些回调封装到承诺中,或检查dock中是否有基于承诺的approach@Estradiaz你认为我应该研究变种2?(那么)王子们我的意思是你需要