我正在try 将函数转换为字符串,以将其发送到工作线程并在那里执行它.然而,在使用导入代码的地方,该字符串包含奇怪的字符.

import { HttpStatus } from '@nestjs/common';
import { access, constants, writeFile } from 'fs/promises';
import path from 'path';
import { Error as CustomError } from 'src/util/Error';
import { AbstractTask } from 'src/util/queue/AbstractTask';

export class CreateFileTask extends AbstractTask<boolean> {
    private path: string;

    private buffer: Buffer;

    constructor(path: string, buffer: Buffer) {
        super();

        this.path = path;
        this.buffer = buffer;
    }

    public async execute(): Promise<boolean> {
        return new Promise(async (resolve, reject) => {
            let resolvedPath = path.resolve(this.path);

            try {
                await access(resolvedPath, constants.F_OK);
            } catch (e) {
                reject(new CustomError(`file at ${this.path} already exists`, HttpStatus.CONFLICT));
            }

            try {
                await writeFile(resolvedPath, this.buffer);
            } catch (e) {
                if (e instanceof Error) {
                    reject(new CustomError(e.message, HttpStatus.INTERNAL_SERVER_ERROR));
                } else {
                    reject(new CustomError(e as string, HttpStatus.INTERNAL_SERVER_ERROR));
                }
            }

            resolve(true);
        });
    }
}

呼叫new CreateFileTask(...).execute.toString()的结果是奇怪的字符:

execute() {
    return new Promise(async (resolve, reject) => {
        let resolvedPath = path.resolve(this.path);
        try {
            await (0, promises_1.access)(resolvedPath, promises_1.constants.F_OK);
        }
        catch (e) {
            reject(new Error_1.Error(`file at ${this.path} already exists`, common_1.HttpStatus.CONFLICT));
        }
        try {
            await (0, promises_1.writeFile)(resolvedPath, this.buffer);
        }
        catch (e) {
            if (e instanceof Error) {
                reject(new Error_1.Error(e.message, common_1.HttpStatus.INTERNAL_SERVER_ERROR));
            }
            else {
                reject(new Error_1.Error(e, common_1.HttpStatus.INTERNAL_SERVER_ERROR));
            }
        }
        resolve(true);
    });
}

使用import * as path from "path"似乎确实可以修复Path模块的问题.为什么会这样呢?有没有其他解决方案,即使不需要也可以用import * as ... from ... AKA进口everthing

推荐答案

这些"奇怪的字符"是您的代码的编译版本,它是Bundle 程序的输出,也是实际执行的代码.但这并不是真正的问题所在.


我正在try 将函数转换为字符串,以将其发送到工作线程并在那里执行它.

你将一个函数转换成一个字符串,并期望它在另一边是可执行的.因此,不要try 对函数进行编码并将其作为字符串传递.

为了发送要执行的函数,您需要从该函数的作用域发送该函数中使用的任何值.这是不切实际的.

例如:

const foo = 123
function logFoo() { console.log(foo) }
console.log(logFoo.toString()) // "function logFoo() { console.log(foo) }"

这里logFoo被转换成一个字符串,但它引用了一个局部变量foo,该变量在输出字符串中是not included.因此,如果您try 将其设置为eval并运行它,它可能会崩溃.

如果要从其他文件或类引用(如this.something)进行导入,则此问题会严重得多.

因此,这种方法是行不通的.不要这样做.


相反,将代码加载到Worker中,然后向其发布包含data本身的消息.

Node.js相关问答推荐

Mongoose:如何在文档中推送到Caped(有限大小,滚动窗口)数组?

将 POST 的 json 变量格式化为 lambda

在全局对象上声明的函数

Typescript 正则表达式:过滤器返回空

在对象数组中的数组中嵌套 $lookup - Mongodb

Mongoose post中间件触发deleteMany

node_modules/preact/src/jsx.d.ts:2145:22 - 错误 TS2304:找不到名称SVGSetElement

如何使用 node.js 将两个或多个 API 请求组合成一个端点并表达

NodeJS 中的流 API 数据如何流动?

NestJS 共享模块的问题

NestJS TypeORM 可选查询不起作用

带有 node.js 和 express 的基本网络服务器,用于提供 html 文件和assets资源

node.js 中 res.setHeader 和 res.header 的区别

制作一个接受命令行参数的脚本

Sequelize 基于关联的查找

如何在客户端使用 node.js 模块系统

使用 pg-promise 进行多行插入

node 应用程序是否有任何独立的 gui 模块

卸载代码/模块

AWS Lambda:如何将秘密存储到外部 API?