我目前正在使用环形客户端-API,在我的开发过程中遇到了一个小问题。我成功地创建、测试和运行了我的RingListener作为一个单独的文件,即通过执行RingListener.mjs。我的目标是现在从另一个文件位置启动侦听器,我遇到了一些问题。我更熟悉CommonJS,所以请随时为我指出正确的方向,ES6的东西,我错过了。我正在运行节点14.15.4
代码RingListener.mjs:
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输出
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
import {start} from './objects/RingListener.mjs'
start();
//await start(); //Returns the same results as just start()Start.mjs输出
Test 1
Test 2当从另一个位置运行它时,它似乎被第一个等待语句卡住了,我不知道为什么。任何帮助都将不胜感激。我很困惑,因为我能够实际执行函数,并获得控制台日志语句,但由于某种原因,在通过另一个文件执行时,它始终在与等待调用完全相同的位置失败。在从另一个文件调用异步函数时,是否遗漏了什么?
谢谢!
编辑:谢谢@JoshA为dotenv的filepath指出了正确的方向。
当我尝试导入另一个js模块时,下面的代码挂在"Test 1 Test 2“上。
import {start} from './objects/RingListener.mjs'
import {default as Webserver} from './app.js'
await start();输出
Test 1
Test 2但是,当我移除导入到另一个类时,它运行得很完美,IE "Test 1,2,3,等等“。
import {start} from './objects/RingListener.mjs'
//import {default as Webserver} from './app.js'
await start();输出
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()从导入中调用它。
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");
})发布于 2021-01-26 01:22:41
我假设您使用dotenv从您的.env文件加载您的凭据,然后将其传递给new RingApi({my credentials})构造函数。
如果是这样,最可能的失败原因是dotenv使用fs.readFileSync读取.env文件,该文件查找相对于执行节点js的路径的文件,而不是相对于模块的路径。这就是为什么如果您从位于不同路径的Start.mjs执行应用程序,它就会停止工作。
如果您确实希望将dotenv调用保存在您的RingListener.mjs文件中,可以将它重写为这样的内容,这将解析.env文件的绝对路径。
import { resolve } from 'path';
dotenv.config({path: resolve(__dirname, '../.env')});如果您得到一个错误__dirname is not defined,这是因为它在ECMAScript模块中作为文档的这里不可用。
作为一种解决办法,你可以这样做。
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')});https://stackoverflow.com/questions/65604448
复制相似问题