首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步.mjs直接调用时工作,从另一个.mjs调用时失败

异步.mjs直接调用时工作,从另一个.mjs调用时失败
EN

Stack Overflow用户
提问于 2021-01-06 22:58:37
回答 1查看 373关注 0票数 0

我目前正在使用环形客户端-API,在我的开发过程中遇到了一个小问题。我成功地创建、测试和运行了我的RingListener作为一个单独的文件,即通过执行RingListener.mjs。我的目标是现在从另一个文件位置启动侦听器,我遇到了一些问题。我更熟悉CommonJS,所以请随时为我指出正确的方向,ES6的东西,我错过了。我正在运行节点14.15.4

代码RingListener.mjs:

代码语言:javascript
复制
import {RingApi} from 'ring-client-api'
import * as dotenv from "dotenv";
dotenv.config({path: '../.env'});
import {readFile, writeFile} from 'fs'
import {promisify} from 'util'
import App from "../objects/GoogleHomeNotification.js";

export async function start() {
    const {env} = process;
    console.log("Test 1")
    const ringApi = new RingApi({my credentials});
    console.log("Test 2")
    const allCameras = await ringApi.getCameras();
    console.log("Test 3")
    console.log("Found " + allCameras.length + " camera(s)")
    ringApi.onRefreshTokenUpdated.subscribe(
        async ({newRefreshToken, oldRefreshToken}) => {
            console.log('Refresh Token Updated: ', newRefreshToken)
        }
    )
    if (allCameras.length) {
        console.log('Listening for motion and doorbell presses on your cameras.')
    }
}
start();

RingListener.mjs输出

代码语言:javascript
复制
Test 1
Test 2
Test 3
Found 1 camera(s).
Refresh Token Updated: {my token}
Now writing it to proper .env file
Listening for motion and doorbell presses on your cameras.

当我试图从另一个文件启动它时,我只访问了Test 2. Start.mjs

代码语言:javascript
复制
import {start} from './objects/RingListener.mjs'

start();
//await start(); //Returns the same results as just start()

Start.mjs输出

代码语言:javascript
复制
Test 1
Test 2

当从另一个位置运行它时,它似乎被第一个等待语句卡住了,我不知道为什么。任何帮助都将不胜感激。我很困惑,因为我能够实际执行函数,并获得控制台日志语句,但由于某种原因,在通过另一个文件执行时,它始终在与等待调用完全相同的位置失败。在从另一个文件调用异步函数时,是否遗漏了什么?

谢谢!

编辑:谢谢@JoshA为dotenv的filepath指出了正确的方向。

当我尝试导入另一个js模块时,下面的代码挂在"Test 1 Test 2“上。

代码语言:javascript
复制
import {start} from './objects/RingListener.mjs'
import {default as Webserver} from './app.js' 

await start();

输出

代码语言:javascript
复制
Test 1 
Test 2

但是,当我移除导入到另一个类时,它运行得很完美,IE "Test 1,2,3,等等“。

代码语言:javascript
复制
 import {start} from './objects/RingListener.mjs'
//import {default as Webserver} from './app.js'

await start();

输出

代码语言:javascript
复制
Test 1 
Test 2
Test 3
Found 1 camera(s).
Refresh Token Updated:  
Now writing it to proper .env file
Listening for motion and doorbell presses on your cameras.

我甚至还没有使用它,它仍然导致它挂起来。最终,我将使用Webserver.listen();但是./app.js只是导出了快递应用程序。

编辑: app.js包含一系列变量初始化和快速应用程序配置。映射到服务器上的不同路由。目标是移除app.js中的app.js(),并将其移动到Start.mjs,并通过Webserver.listen()从导入中调用它。

代码语言:javascript
复制
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var logger = require('morgan');
require('dotenv').config()

/* Variable def here */

var app = express();
// app config here

/*  Exports  */
module.exports = app;

app.listen(1337, () => {
    console.log("Starting server on 1337");
})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-26 01:22:41

我假设您使用dotenv从您的.env文件加载您的凭据,然后将其传递给new RingApi({my credentials})构造函数。

如果是这样,最可能的失败原因是dotenv使用fs.readFileSync读取.env文件,该文件查找相对于执行节点js的路径的文件,而不是相对于模块的路径。这就是为什么如果您从位于不同路径的Start.mjs执行应用程序,它就会停止工作。

如果您确实希望将dotenv调用保存在您的RingListener.mjs文件中,可以将它重写为这样的内容,这将解析.env文件的绝对路径。

代码语言:javascript
复制
import { resolve } from 'path';
dotenv.config({path: resolve(__dirname, '../.env')});

如果您得到一个错误__dirname is not defined,这是因为它在ECMAScript模块中作为文档的这里不可用。

作为一种解决办法,你可以这样做。

代码语言:javascript
复制
import { fileURLToPath } from 'url';
import { dirname, resolve } from 'path';

// Initialize __dirname
const __dirname = dirname(fileURLToPath(import.meta.url));

// Then use it to resolve path for .env
dotenv.config({path: resolve(__dirname, '../.env')});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65604448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档