我的應用程式使用在終端中輸出結果的端到端測驗框架 (Cypress)。在測驗前端代碼的更改時,我使用 Vue 開發服務器的
proxy選項將 API 請求路由到遠程后端服務器。
由于沖擊此測驗服務器的請求負載很高,我們的應用程式前端預計某些請求會失敗,并且它能夠智能地處理重試給定的失敗 API 呼叫。但是,代理處理程式不知道這一點,因此控制臺日志變得混亂,ECONNRESET代理錯誤,如下所示。
Proxy error: Could not proxy request /api/XXXXXX from local.myapp.io:3000 to https://myapp-dev.appspot.com.
See https://nodejs.org/api/errors.html#errors_common_system_errors for more information (ECONNRESET).
Proxy error: Could not proxy request /api/XXXXXX from local.myapp.io:3000 to https://myapp-dev.appspot.com.
See https://nodejs.org/api/errors.html#errors_common_system_errors for more information (ECONNRESET).
Proxy error: Could not proxy request /api/XXXXXX from local.myapp.io:3000 to https://myapp-dev.appspot.com.
See https://nodejs.org/api/errors.html#errors_common_system_errors for more information (ECONNRESET).
Proxy error: Could not proxy request /api/XXXXXX from local.myapp.io:3000 to https://myapp-dev.appspot.com.
See https://nodejs.org/api/errors.html#errors_common_system_errors for more information (ECONNRESET).
? C22756 should be disabled when no events exist (8018ms)
? C22757 should be clickable when events exist (2250ms)
Widget Settings
Proxy error: Could not proxy request /api/XXXXXX from local.myapp.io:3000 to https://myapp-dev.appspot.com.
See https://nodejs.org/api/errors.html#errors_common_system_errors for more information (ECONNRESET).
? C22758 should have name, date range, and account fields (2435ms)
這些錯誤可能會變得非常冗長,并且往往會隱藏/掩蓋更簡潔的測驗輸出,從而使其難以掃描并且幾乎不可能有效地復制。
有沒有辦法從開發服務器/代理處理程式中抑制這些錯誤訊息?理想情況下,在 NPM 腳本或 Vue/Webpack 配置 JS 檔案中會有某種形式的配置,允許我在運行我們的測驗套件時忽略或隱藏這些錯誤。
作為參考,這里是傳遞給vue.config.js
檔案devServer屬性的配置物件:
const config = {
allowedHosts: ['localhost', 'local.myapp.io'],
contentBase: path.join(__dirname, 'root/of/frontend/code'),
disableHostCheck: true,
historyApiFallback: true,
https: {
cert: LocalDevCert.getCert(),
key: LocalDevCert.getKey()
},
port: 3000,
proxy: {
'^(?!/(js|modules|img))': {
target: 'https://myapp-dev.appspot.com',
cookieDomainRewrite: 'local.myapp.io',
changeOrigin: true,
secure: true,
bypass (req, res) {
const xsrfToken = uuid();
if (req.headers.accept && req.headers.accept.includes('html')) {
res.cookie('MyXSRFToken', xsrfToken);
res.cookie('MyXSRFToken_C80', xsrfToken);
return '/index.html';
}
if (req.method === 'GET' && req.url.includes('login') && !req.url.includes('google')) {
res.cookie('MyXSRFToken', xsrfToken);
res.cookie('MyXSRFToken_C80', xsrfToken);
return '/';
}
}
}
},
public: 'local.myapp.io:3000'
};
我努力了:
- 使用devServer.client.logging 配置選項,但這只會更改瀏覽器控制臺(而不是命令列終端)中顯示的內容。
- 將logLevel 配置選項添加到相應的代理配置物件(即
^(?!/(js|modules|img))上面帶有鍵的物件),但這似乎只會增加日志記錄的數量(資訊以及錯誤)。
我懷疑某些東西需要在較低的水平上被壓制,也許一些 bash-script 魔法是唯一可行的解??決方案。
uj5u.com熱心網友回復:
您可以在測驗頂部添加過濾器,或者在/cypress/support/index.js.
Cypress.on('window:before:load', window => {
const originalConsoleLog = window.console.log;
window.console.log = (msg) => {
const isProxyError = msg.includes('ECONNRESET') || msg.startsWith('Proxy error:');
if (!isProxyError) {
originalConsoleLog(msg)
}
}
})
uj5u.com熱心網友回復:
我最終確定的解決方法是process.stdout.write在配置和運行開發服務器/測驗的 Javascript 檔案中進行攔截。由于我們的test命令是作為 Vue CLI 插件實作的,我可以將覆寫函式放在該插件中module.exports,如下所示:
module.exports = (api, options) => {
api.registerCommand(
'customTestCommand',
{
description: 'A test command for posting on Stack Overflow',
usage: 'vue-cli-service customTestCommand [options]',
options: {
'--headless': 'run in headless mode without GUI'
...
}
},
async (args, rawArgs) => {
// Do other setup work here
process.stdout.write = (function (write) {
let clearBlankLine = false;
return function (...args) {
const string = args[0];
const isProxyError = !!string.match(/Proxy error:|ECONNRESET/);
const hasContent = !!string.trim();
if (isProxyError) {
clearBlankLine = true;
return;
}
if (!clearBlankLine || hasContent) {
write.apply(process.stdout, args);
}
clearBlankLine = false;
};
}(process.stdout.write));
// Wait to run your actual dev server process and test commands
// Until here.
}
);
};
這將維護命令列輸出上的所有顏色、間距、歷史清除等,但任何具有術語Proxy Error或被ECONNRESET洗掉的行。您可以根據您的特定需求自定義正則運算式。
有關攔截 stdout 和 stderr 以及將這些輸出重定向到不同位置(例如檔案)的更詳細示例,請參閱 Ben Buckman 的以下 Github 要點,該要點啟發了我的解決方案:https ://gist.github.com/benbuckman /2758563
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/445957.html
