Js 脚本连接到 mongodb,但作为 cron 执行时却无法连接

问题描述 投票:0回答:1

我正在从 js 脚本连接到 mongodb(在 Ubuntu 机器上);当我从命令行执行命令时(

node name of the script
)一切正常,但是当我从 cron 执行相同的命令时,连接超时:

const mongodb = require("mongodb").MongoClient;

async function dbConnection() {
    // I've checked this variable and it's valid both when executed as cron or 
    // simply from command line
    let url = env.DB_URL;

    // Mongo options
    let opts = {
        useNewUrlParser: true,
        useUnifiedTopology: true
    };

    try {
        return mongodb.connect(url, opts);
    } catch (err) {
        throw err;
    }
}

async function DataLoading() {
    try {
        let dbInstance;
        try {
            dbInstance = await dbConnection()
            if(!dbInstance)
                throw "DB connection failed"
        } catch (err) {
            errors.push({
                date: new Date().toISOString(),
                error: err,
                location: "Db connection" 
            });
        }
        console.log("Time elapsed: " + (new Date() - time) )
        // On cron dbInstance is undefined, causing an error, on command line it's what's supposed to
        let dbStocks = dbInstance.db(env.DB_NAME).collection("stocks")

作为 cron 执行时,经过的控制台日志大约为 30 秒,从命令行执行时为几百毫秒。

注意:当我说命令行时,我指的是服务器的命令行(mongo 在本地主机上),而不是我的远程个人计算机。

javascript node.js mongodb cron dbconnection
1个回答
0
投票

这可能是由于缺少环境变量造成的。您需要在 crontab 本身中手动设置脚本的环境,或者让脚本直接从文件(或其他源)加载配置的值。

例如

* * * * * DB_URL=localhost:27017 DB_NAME=my_db node name_of_script

Cron 作业在非交互式、非登录 shell 中执行;因此,他们不获取默认的 shell 启动脚本 - 例如

~/.bashrc
~/.bash_profile
- 并且无法访问您在当前终端会话期间设置的相同环境变量。

配置 cron 作业的方法有很多。您最终使用哪一种取决于您的特定环境、最佳实践和个人喜好。

© www.soinside.com 2019 - 2024. All rights reserved.