# Intro 現在在使用 nodejs 時可以使用副檔名 .mjs 的方式和 package.js 添加 "type": "module" 來使用 import 來取代 require
關於這件事也是因為有許多歷史因素無法完全取代掉 require
但是如果我們想要在 cloud functions 或是 firebase functions 使用時就沒那麼順利
因為光是要使用 .mjs 就是個問題
但是參考下面的文章後發現有取巧的方式
refer - ES6+ in Cloud Functions for Firebase #2
# Solution 先說結論
其實就是先用 babel build 完 code
最後把 build 完的 code 部署到 functions 上面
以 firebase functions 專案的例子
我自己的做法是 多建立一個 src 的目錄來當成再開發的 code
在部署前 build 到 functions 的目錄
package.json
添加
"scripts": { "build": "babel src --out-dir functions" } npm run build
...
Category: Nodejs
# 介紹 PM2 是一個可以方便處理 node process 的工具
大多用於線上環境
這邊主要紀錄 PM2 的一些用法與指令
# 基本使用 可以參考官方文件 PM2 Process Management Quick Start
安裝
npm install pm2 -g 啟動
pm2 start <要啟動的 js> 通常建議啟動時的指令搭配以下參數(更多參數請詳閱文件)
# Specify an app name --name <app_name> # Watch and Restart app when files change --watch # Set memory threshold for app reload --max-memory-restart <200MB> # Specify log file --log <log_path> # 重新載入 pm2 reload <要重啟的 app> 大多用於程式部署更新後, 有較好的體驗(和 restart 相比)
...
一直以來大部分時間都在用 PHP 開發
所以也用 PHP 來處理 HTML Form
所以都下意識地認為 <input type="checkbox" name="game[]" value="FGO">
這樣的 name="game[]" 的處理方式是正規的處理 HTML Form 的多選的方式
也疑惑為何大多的 HTML Form 的教學甚至 MDN 都沒有提到這件事
就在某一天我在檢視到同事寫的 code 時
發現同事用 JavaScript 處理
硬爬出來自己組字串送出去
我才想起這令人感到恐懼的事情
因為公司同事是寫 golang 的專門, 就算前端不熟
應該也不至於連這樣概念都沒有就用硬爬的方式處理
所以再調整的同時也跟同事確認後
我也真正的直視這問題
到底要怎麼處理表單中多選的資料?
PHP 寫久的人大多都知道要用上面列出的方法
name="game[]"
就是 game + []
但是當我認真地尋找關於這個問題時
意外地發現了一篇 stackoverflow 的問答
Several Checkboxes sharing the same name
其實 W3C 根本沒有管你 name="" 重複要如何處理
以下是 PHP, nodejs, golang 的原生方式來測試的結果
# PHP 以下問答有提供了 PHP doc 說明 PHP 如何處理多選
...
# Node.js - 簡單起一個 local server 進行測試 # 緣由 如果要臨時起一個 local 的 server 測試前端可以考慮用 Node 的一個套件 http-server 來做
為啥有這需求呢?
可能的情境如下
原本的 localhost(127.0.0.1) 被其他服務佔用時, 且無法依附在該 localhost 底下時
當要測試的前端程式需要是有第三方 API 驗證 domain 時且在上述情境時可以用(大部分的第三方 API 或 oauth 通常允許可以設置 localhost)
PS. 假設無法設定 localhost(得設定一個真實的 domain) 也可設定 host 解決這問題(但 host 是不吃 port 的所以在第一點的情況下這方案是無法成立的
# 其他建議 其實還有其他我覺得不太好的方式
例如
在本地的的 Apache or Nginx 設定 RewriteRule or Path or Proxy
用最方便的 file 方式打開(但如果有用到第三方服務需要 domain 驗證的就 GG 了)
# 使用方式 這裡只提供簡單的用法
...
# Node.js - 直接執行指令 因為最近要用 nodejs 做一些事, 所以就趕鴨子上架的先把功能做出來再說
然後就立馬遇到問題了…
在 PHP 中要直接執行 command line 是使用 exec
因為之前都用 PHP 寫 Shell Scripts 所以找了一下用 nodejs 要如何寫
先是找到了以下的 code
function run_cmd(cmd, args, callBack ) { var spawn = require('child_process').spawn; var child = spawn(cmd, args); var resp = ""; child.stdout.on('data', function (buffer) { resp += buffer.toString(); }); child.stdout.on('end', function() { callBack (resp); }); } // example run_cmd( "ls", ["-l"], function(text) { console.log (text) ; }); 但是發現如果是要用像是 mkdir 或者要 run shell 就會出 ENOENT 的 error
...