[英]Apollo Server Upload File failes in Docker
UPD幾個小時后,我有了在 docker 中嘗試另一個節點版本的好主意。 Alpine 給出了這個錯誤,而 10.15 工作正常。
我的解析器中有以下 function 通過 apollo graphql 上傳文件
return new Promise(function(resolve, reject) {
const { createReadStream, filename, mimetype } = file
if (!(mimetype === 'image/png' || mimetype === 'image/jpeg' || mimetype === 'image/jpg')){
const error = new Error('Forbidden file type ', mimetype)
error.code = 415
reject(error)
}
const savedFileName = uuidv4()+path.extname(filename)
const savedFile = path.join(__dirname, '..', 'images', subDir, savedFileName)
const imagePath = path.join('/images', subDir, savedFileName).replace(/\\/g, "/")
const readStream = createReadStream()
const writeStream = fs.createWriteStream(savedFile, { flags : 'w' });
readStream.pipe(writeStream)
readStream.on('error', () => console.log('reading error'))
writeStream.on('finish', () => resolve({file: savedFile, imageUrl: imagePath}))
writeStream.on('error', (error) => {
//const err = new Error('Error writing file')
//error.code = 422
reject(error)
})
它在我的 Windows 開發環境中運行良好。 我嘗試為我的項目創建 docker 容器,但此代碼段失敗並出現錯誤:
internal/fs/streams.js:120
node_1 | function _openReadFs(stream) {
node_1 | ^
node_1 |
node_1 | RangeError: Maximum call stack size exceeded
node_1 | at _openReadFs (internal/fs/streams.js:120:21)
node_1 | at ReadStream.<anonymous> (internal/fs/streams.js:116:3)
node_1 | at ReadStream.deprecated [as open] (internal/util.js:70:15)
node_1 | at ReadStream.open (/app/node_modules/fs-capacitor/lib/index.js:90:11)
node_1 | at _openReadFs (internal/fs/streams.js:123:12)
node_1 | at ReadStream.<anonymous> (internal/fs/streams.js:116:3)
node_1 | at ReadStream.deprecated [as open] (internal/util.js:70:15)
node_1 | at ReadStream.open (/app/node_modules/fs-capacitor/lib/index.js:90:11)
node_1 | at _openReadFs (internal/fs/streams.js:123:12)
node_1 | at ReadStream.<anonymous> (internal/fs/streams.js:116:3)
node_1 | at ReadStream.deprecated [as open] (internal/util.js:70:15)
node_1 | at ReadStream.open (/app/node_modules/fs-capacitor/lib/index.js:90:11)
node_1 | at _openReadFs (internal/fs/streams.js:123:12)
node_1 | at ReadStream.<anonymous> (internal/fs/streams.js:116:3)
node_1 | at ReadStream.deprecated [as open] (internal/util.js:70:15)
node_1 | at ReadStream.open (/app/node_modules/fs-capacitor/lib/index.js:90:11)
node_1 | at _openReadFs (internal/fs/streams.js:123:12)
node_1 | at ReadStream.<anonymous> (internal/fs/streams.js:116:3)
node_1 | at ReadStream.deprecated [as open] (internal/util.js:70:15)
node_1 | at ReadStream.open (/app/node_modules/fs-capacitor/lib/index.js:90:11)
node_1 | at _openReadFs (internal/fs/streams.js:123:12)
node_1 | at ReadStream.<anonymous> (internal/fs/streams.js:116:3)
node_1 | [nodemon] app crashed - waiting for file changes before starting...
我是 docker 的新手,尤其是 linux 的新手。 在 linux 中讀取和管道處理的方式可能有所不同。 但我不明白在哪里看。 是阿波羅問題還是 docker 問題還是我的 linux 知識貧乏問題。 將不勝感激任何建議。
這是由於節點棄用了一些內部 stream API,請參閱DEP0135:WriteStream.open() 和 ReadStream.open() 是內部的。
WriteStream.open()
和ReadStream.open()
是未記錄的內部 API,在用戶空間中使用沒有意義。 文件流應始終通過其相應的工廠方法fs.createWriteStream()
和fs.createReadStream()
) 或通過在選項中傳遞文件描述符來打開。
有一個問題試圖解決這個問題: Upgrade graphql-upload to 9.0 to support Node.JS 13 。 關鍵是fs-capacitor已更新以解決此問題,但依賴它的所有內容都需要相應更新。
現在,您需要使用節點 12 或至少 13 之前的東西。
我通過在我的“Dockerfile”中明確定義節點來解決我的問題,我的本地環境正在運行 v11.14.0,您可以通過
node -v
一旦我修改了我的“Dockerfile”以使用
FROM node:11
在我的開場白中,它在那之后第一次嘗試。
希望這可以幫助你
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.