如何使用 nextjs 项目运行独立的 cli 脚本?

twa*_*sta 11 node.js es6-modules next.js

我有一个正在运行的 nextjs 项目。

我需要创建一个可以从 CLI 运行的脚本,该脚本使用我为下一个项目编写的一些 CRUD 库。

**/scripts/backup-assets.js **

import {getAllProjectsData} from '../lib/api/projects'

async function main() {
  const allProjectsData = await getAllProjectsData()
  console.info({allProjectsData})
}

main()
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

$ node scripts/backup-assets.js 
(node:9736) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)
C:\Users\...\scripts\backup-assets.js:1
import {getAllProjectsData} from '../lib/api/projects'
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at Object.compileFunction (node:vm:352:18)
    at wrapSafe (node:internal/modules/cjs/loader:1033:15)
    at Module._compile (node:internal/modules/cjs/loader:1069:27)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
    at node:internal/main/run_main_module:17:47
Run Code Online (Sandbox Code Playgroud)

phi*_*e_b 22

使用多伦多证券交易所。它与 NextJS 一起开箱即用,同时支持 JavaScriptTypeScript。

安装它:

npm install --save-dev tsx
Run Code Online (Sandbox Code Playgroud)

声明你的脚本。在package.json

...
"scripts": {
  ...
  "my-js-script": "tsx scripts/my-script.js",
  "my-ts-script": "tsx scripts/my-script.ts"
},
Run Code Online (Sandbox Code Playgroud)

运行:

npm run my-js-script
npm run my-ts-script
Run Code Online (Sandbox Code Playgroud)


小智 2

我还没有找到一种方法来做到这一点,但这里有一个解决方法:

  1. 创建一个名为的 API 路由,/api/scripts该路由需要一个task参数。

  2. 添加检查以防止其在生产环境中运行(如果您想在生产环境中运行脚本,则添加身份验证)。

export default async function handler(req, res) {
  
  if (process.env.NODE_ENV === 'production') return res.status(404).end();

  switch (req.query.task) {
    case 'backup-assets':
      // code
    case 'migrate-database':
      // code

Run Code Online (Sandbox Code Playgroud)
  1. 根据需要以开发或生产模式启动:
npm run dev
Run Code Online (Sandbox Code Playgroud)
  1. 使用curl从命令行运行所需的脚本:
export default async function handler(req, res) {
  
  if (process.env.NODE_ENV === 'production') return res.status(404).end();

  switch (req.query.task) {
    case 'backup-assets':
      // code
    case 'migrate-database':
      // code

Run Code Online (Sandbox Code Playgroud)

或者直接在浏览器中访问该 URL。