首页 > 解决方案 > Nodejs 不识别异步函数和引用

问题描述

当我像这个节点 index.js 在终端中运行我的项目时

我收到一个参考错误:未定义配置

/home/ether/Documents/nodesendeth/index.js:6 const {asset, base, spread, allocation} = config; ^

ReferenceError: config is not defined
    at tick (/home/ether/Documents/nodesendeth/index.js:6:47)
    at run (/home/ether/Documents/nodesendeth/index.js:49:3)
    at Object.<anonymous> (/home/ether/Documents/nodesendeth/index.js:52:1)
    at Module._compile (internal/modules/cjs/loader.js:1151:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1171:10)
    at Module.load (internal/modules/cjs/loader.js:1000:32)
    at Function.Module._load (internal/modules/cjs/loader.js:899:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47

在我的代码中,我分配了这样的配置常量:

require('dotenv').config;
const ccxt = require('ccxt');
const axios = require('axios');

const tick = async => {
    const {asset, base, spread, allocation} = config;
    const market = `${asset}/${base}`;

    const orders =  binanceClient.fetchOpenOrders(market);
    orders.forEach(async order => {
        await binanceClient.cancelOrder(order.id);
    });
    const results =  Promise.all([
      axios.get('https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd'),
      axios.get('https://api.coingecko.com/api/v3/simple/price?ids=tether&vs_currencies=usd')
    ]);
    const marketPrice = results[0].data.bitcoin.usd / results[1].data.tether.usd;

    const sellPrice = marketPrice * (1 + spread);
    const buyPrice = marketPrice  * (1 - spread);
    const balances = binanceClient.fetchBalance();
    const assetBalance = balances.free[asset];
    const baseBalance = balances.free[base];
    const sellVolume = assetBalance * allocation;
    const buyVolume = (baseBalance * allocation) / marketPrice;

    binanceClient.createLimitSellOrder(market, sellVolume, sellPrice);
    binanceClient.createLimitBuyOrder(market, sellVolume, buyPrice);

     console.log(`
        New tick for ${market}...
        Created limit sell order for ${sellVolume}@${sellPrice}
        Create limit buy order for ${buyVolume}@${buyPrice}`)
}

const run = () => {
    const config = {
      asset: 'BTC',
      base: 'USDT',
      allocation: 0.1,
      spread: 0.2,
      tickInterval: 2000
    };
  const binanceClient = new ccxt.binance({
    apiKey: process.env.API_ENV,
    secret: process.env.API_SECRET,
  });

  tick(config, binanceClient);
  setInterval(tick, config.tickInterval, config, binanceClient);
}
run()

我也收到等待错误,说我需要在我所做的同步功能中运行它们。我现在删除了 await 关键字,但应用程序应该使用 await 关键字运行,因为这些函数是异步的。

当我有一个配置变量和一个异步函数时,为什么会出现这些错误?

我假设我的 async 函数不起作用,因为它既不识别配置常量也不识别 async/await 调用

标签: node.js

解决方案


config在您的代码中未定义。

您可能打算在这一行声明它,如下所示:

const config = require('dotenv').config();

...但这只是您问题的一半,因为此外,返回的对象.config()将所有变量放在一个parsed属性中。

例如,如果您的 .env 看起来像这样:

apple=red
ball=blue

...而您刚刚登录config,您会看到:

{解析:{苹果:'红色',球:'蓝色'}}

然后你可以写:

const {apple, ball} = require('dotenv').config().parsed;
console.log(apple, ball);

这会写:

红蓝

在您的特定情况下,如果您希望asset, base, spread, 和allocation成为 .env 文件中的环境变量,那么您可能会将该行更改为:

const {asset, base, spread, allocation} = config.parsed;

推荐阅读