簡體   English   中英

如何測試節點文件,在生成函數時收到“EACCES”錯誤

[英]How to test an node file, receiving an 'EACCES' error when spawning the function

創建 CLI 時,我想測試我的功能。 為此,我正在使用模塊child_process

const path = require('path');
const { execFile } = require('child_process');

describe('cli test', () => {
  test('thing', () => {

    const myCli = execFile(
      `${path.resolve(__dirname, '..')}/cli.js`, ['--foo', 'Bar'],
      (err, stdout, stderr) => {
      if (err) {
        console.log('err: ', err);
      }
    });
});

但這會產生以下錯誤:

Attempted to log "err:  { Error: spawn /projects/cli/src/cli.js EACCES
        at Process.ChildProcess._handle.onexit (internal/child_process.js:240:19)
        at onErrorNT (internal/child_process.js:415:16)
        at process._tickCallback (internal/process/next_tick.js:63:19)
      errno: 'EACCES',
      code: 'EACCES',

通過以下命令直接在終端中運行此腳本: $ node cli.js --foo Bar完美運行。

現在一個建議是chmod +x <file>那個文件( source )。 但是該測試也應該在 CI 上以及在拉 Git 存儲庫的另一台計算機上工作。

任何的想法?

我建議使用fork而不是execFile

所述child_process.fork()方法是一個特殊情形child_process.spawn()專門用於產生新的Node.js過程。

這將允許您執行 JS 文件而不需要它們是 shell 可執行文件。

據我所知,git 實際上跟蹤文件的可執行位。 正如本文所指出的,有一些事情需要考慮: https : //medium.com/@tahteche/how-git-treats-changes-in-file-permissions-f71874ca239d

另一個解決方案是不依賴./執行語法(這需要為相應的文件打開可執行位),而是顯式使用 shell 命令:

const path = require('path');
const { execFile } = require('child_process');

describe('cli test', () => {
  test('thing', () => {

    const myCli = execFile(
      `sh ${path.resolve(__dirname, '..')}/cli.js`, ['--foo', 'Bar'],
      (err, stdout, stderr) => {
      if (err) {
        console.log('err: ', err);
      }
    });
});

請注意我添加到您的代碼中的sh前綴,這樣您就可以使用sh命令(它應該在您的所有環境中都可用,例如 CI)來執行文件的內容,而不管文件本身是否可以執行!

嘗試運行命令行 mysql 命令時,我收到來自 child_process.spawn 的 EACCESS -13 錯誤。

我的 PATH 有問題並更新它以添加 /usr/local/mysql/bin/ 解決了問題。

臨時修復是運行export PATH=$PATH:/usr/local/mysql/bin/

永久修復是:

  1. 類型: sudo nano /etc/paths
  2. 在最后添加/usr/local/mysql/bin
  3. Ctrl + X
  4. 是的
  5. 回車鍵
  6. 鍵入 hash -r @ 命令行 或關閉終端應用程序並再次打開它

注意:我從一個站點獲得了臨時修復......我不知道為什么它在 bin 的末尾有一個 / 但所有 mysql 可執行文件似乎都可用,而 /etc/paths 文件中沒有它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM