sikro 发表于 2021-9-5 23:36

nodejs如何让require函数等待exports返回结果

主程序中有一段代码

const notify = $.isNode() ? require('./sendNotify') : '';
const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
let jdNotify = true;


jdCookie.js   请求一个对象存储中的文件,再把结果 exports出来,赋给 jdCookieNode

jdCookie.js代码如下:

var COS = require('cos-nodejs-sdk-v5');
var cos = new COS({
SecretId: '',
SecretKey: ''
});
function getfile() {
return new Promise((resolve, reject) => {
    cos.getObject({
      Bucket: 'scf-deploy-ap',
      Region: 'ap-beijing',
      Key: 'file_name',
    }, function (err, data) {
      console.log(err || data.Body.toString('utf8'));
      CookieJDs = JSON.parse(data.Body.toString('utf8')).pt;
      resolve(CookieJDs);
    }
    )
})
};


(async () => {
await getfile()
if (process.env.JD_COOKIE) {
    if (process.env.JD_COOKIE.indexOf('&') > -1) {
      console.log(`您的cookie选择的是用&隔开\n`)
      CookieJDs = process.env.JD_COOKIE.split('&');
    } else if (process.env.JD_COOKIE.indexOf('\n') > -1) {
      console.log(`您的cookie选择的是用换行隔开\n`)
      CookieJDs = process.env.JD_COOKIE.split('\n');
    } else {
      CookieJDs = [process.env.JD_COOKIE];
    }
}
CookieJDs = [...new Set(CookieJDs.filter(item => item !== "" && item !== null && item !== undefined))]
console.log(`\n====================共有${CookieJDs.length}个京东账号Cookie=========\n`);
console.log(`==================脚本执行- 北京时间(UTC+8):${new Date(new Date().getTime() + new Date().getTimezoneOffset() * 60 * 1000 + 8 * 60 * 60 * 1000).toLocaleString()}=====================\n`)
for (let i = 0; i < CookieJDs.length; i++) {
    const index = (i + 1 === 1) ? '' : (i + 1);
    exports['CookieJD' + index] = CookieJDs[i].trim();
    console.log('导出', CookieJDs[i].trim())
}
})();


现在测试的数据能正常exports出来,但是主程序一直不等待数据返回就继续执行导致后面的程序读取不到jdCookieNode 这个变量的值,谁知道如何解决?

fankangfan 发表于 2021-9-6 09:10

可以考虑写一个函数,把异步代码用async await的方式变成同步代码

快乐小风 发表于 2021-9-6 10:17

2楼方法可以, 用aync await 同步调用 jdCookieNode 这个函数

libook7 发表于 2021-9-6 11:44

让这个模块返回一个async函数:
var COS = require('cos-nodejs-sdk-v5');
var cos = new COS({
    SecretId: '',
    SecretKey: ''
});
function getfile() {
    return new Promise((resolve, reject) => {
      cos.getObject({
            Bucket: 'scf-deploy-ap',
            Region: 'ap-beijing',
            Key: 'file_name',
      }, function (err, data) {
            console.log(err || data.Body.toString('utf8'));
            CookieJDs = JSON.parse(data.Body.toString('utf8')).pt;
            resolve(CookieJDs);
      }
      )
    })
};

module.exports = async () => {
    const cookies = {};
    await getfile()
    if (process.env.JD_COOKIE) {
      if (process.env.JD_COOKIE.indexOf('&') > -1) {
            console.log(`您的cookie选择的是用&隔开\n`)
            CookieJDs = process.env.JD_COOKIE.split('&');
      } else if (process.env.JD_COOKIE.indexOf('\n') > -1) {
            console.log(`您的cookie选择的是用换行隔开\n`)
            CookieJDs = process.env.JD_COOKIE.split('\n');
      } else {
            CookieJDs = ;
      }
    }
    CookieJDs = [...new Set(CookieJDs.filter(item => item !== "" && item !== null && item !== undefined))]
    console.log(`\n====================共有${CookieJDs.length}个京东账号Cookie=========\n`);
    console.log(`==================脚本执行- 北京时间(UTC+8):${new Date(new Date().getTime() + new Date().getTimezoneOffset() * 60 * 1000 + 8 * 60 * 60 * 1000).toLocaleString()}=====================\n`)
    for (let i = 0; i < CookieJDs.length; i++) {
      const index = (i + 1 === 1) ? '' : (i + 1);
      cookieIds['CookieJD' + index] = CookieJDs.trim();
      console.log('导出', CookieJDs.trim())
    }
    return cookies;
};

然后在外部require这个文件,找时机再调用:
const getJdCookie=require('./jdCookie.js');

// ……
// 某个地方需要开始读取Cookie,在async函数内:
const cookies=await getJdCookie();
// cookies的结构就是你原来想export出来的那个结构。
页: [1]
查看完整版本: nodejs如何让require函数等待exports返回结果