簡體   English   中英

Docker 中的 Apollo 服務器上傳文件失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM