Проблема

У меня есть скрипт, который работал, запустив node index.js. Поскольку я пытаюсь эмулировать структуру функции AWS Lambda, я перенес текущую логику кода в функцию, определенную как export async function handler(...) {. Эту функцию можно запустить через командную строку с помощью команды node -e "import('./index.js').then(module => module.handler())".

Желаемый результат

Я хотел бы запустить команду: node -e "import('./index.js').then(module => module.handler())", определив ее в сценариях npm. Предпочтительно, чтобы он запускался с помощью npm start.

Попытки Решений

В package.json:

{
  ...
  "scripts": {
    "start": "...",
  },
  ...
}

Попытки были предприняты с "start": "...", установленными на эти, возвращали ошибки при выполнении:

  • "node -e 'import(\\'./index.js\\').then(module => module.handler())'"
  • "node -e 'import(\\'./index.js\\').then(function (module) { module.handler(); })'"
  • "node --eval='import(\\'./index.js\\').then(module => module.handler())'"
  • "node --eval='import(\\'./index.js\\').then(function (module) { module.handler(); })'"

Попытки, сделанные с ними, казалось, не оценивали:

  • "node -e 'import(\\'./index.js\\').handler()'"
  • "node --eval='import(\\'./index.js\\').handler()'"
  • "node -e 'require(\\'./index.js\\').handler()'"
  • "node --eval='require(\\'./index.js\\').handler()'"

Я понимаю, что это избыточно, я пытаюсь быть тщательным. Любая помощь приветствуется.

0
holtkampjs 16 Мар 2023 в 22:05
Поместите код, который вы с трудом запускаете, используя node -e, в файл JavaScript и запустите этот файл JS, используя npm start. Или напрямую с помощью node.
 – 
axiac
16 Мар 2023 в 22:33
Я ценю предоставленные ответы! @Konrad Ваш пост ответил на мой вопрос так, как я представлял себе решение. Есть ли здесь отраслевой стандарт, который мог бы направить меня в будущем при принятии решений между node -e ... и написанием стартового сценария на будущее?
 – 
holtkampjs
16 Мар 2023 в 22:49

3 ответа

Лучший ответ

Я бы просто создал scripts/start.js

import { handler } from './index.js'
handler()

А потом...

{
  ...
  "scripts": {
    "start": "node scripts/start.js"
  },
  ...
}
2
Charlie Martin 16 Мар 2023 в 22:10

Это должно работать:

"start": "node -e \"import('./index.js').then(module => module.handler())\""
1
Konrad 16 Мар 2023 в 22:20

На основе этого ответа https://stackoverflow.com/a/68848622/5089567

Вы можете добавить этот код в свой скрипт:

import { pathToFileURL } from 'url'

if (import.meta.url === pathToFileURL(process.argv[1]).href) {
  handler()
}

А затем просто запустите файл, например

node index.js
0
Konrad 16 Мар 2023 в 22:26
Это плохая идея. Теперь файл содержит компонент. Компонент не должен пытаться определить, как он выполняется, и принимать решения на основе этого. Ответственность за предоставление информации, необходимой компоненту для принятия решений, лежит на вызывающем объекте.
 – 
axiac
16 Мар 2023 в 22:35
Это довольно распространенный шаблон в других языках, таких как python.
 – 
Konrad
16 Мар 2023 в 22:38