gpt4 book ai didi

node.js - Node-LokiJS : not all get requests are fulfilled, 请求状态永远处于待处理状态?

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:37 25 4
gpt4 key购买 nike

我按照本教程使用 multer-express 上传文件,然后通过 id Scoth.io 检索图像.

该设置使用 LokiJS 作为数据库。

所有 API 都工作正常,但是当按 ID 检索多个图像的 API 不适用于多个图像时。大多数获取请求在服务器上处于待处理状态(Chrome 开发工具的网络面板中的状态处于待处理状态)。

一旦处于挂起状态(永远挂起),请求就永远不会完成,并且服务器会陷入其中。

Pending-network-requests-chrome-dev-tools

通过 ID 检索图像的 API

app.get('/images/:id', async (req, res) => {
try {
const col = await loadCollection(COLLECTION_NAME, db);
const result = col.get(req.params.id);

if (!result) {
res.sendStatus(404);
return;
};

res.setHeader('Content-Type', result.mimetype);
fs.createReadStream(path.join(UPLOAD_PATH, result.filename)).pipe(res);
} catch (err) {
res.sendStatus(400);
}
})

Index.ts(所有 API)

import * as express from 'express'
import * as multer from 'multer'
import * as cors from 'cors'
import * as fs from 'fs'
import * as path from 'path'
import * as Loki from 'lokijs'

import { loadCollection, imageFilter } from './utils'

//setup
const DB_NAME = 'db.json'
const COLLECTION_NAME = 'images'
const UPLOAD_PATH = 'uploads'
const upload = multer({ dest: `${UPLOAD_PATH}/`, fileFilter: imageFilter }) //MULTER CONFIG
const db = new Loki(`${UPLOAD_PATH}/${DB_NAME}`, { persistenceMethod: 'fs' })

// app
const app = express();
app.use(cors());

app.get('/', (req, res) => {
res.json({responseText : 'Server running successfully'})
})


//Upload Single
app.post('/fileUpload', upload.single('file'), async (req, res) => {

try {
const col = await loadCollection(COLLECTION_NAME, db)
const data = col.insert(req.file)

db.saveDatabase()
res.send({id: data.$loki, fileName: data.filename, originalName: data.originalname })
} catch (err) {
res.sendStatus(400)
}
})

//Upload Multiple
app.post('/photos/upload', upload.array('photos', 12), async (req, res) => {

try {
const col = await loadCollection(COLLECTION_NAME, db)
const data = [].concat(col.insert(req.files))

db.saveDatabase()
res.send(data.map(x => ({ id: x.$loki, fileName: x.filename, originalName: x.originalname })));
} catch (err) {
res.sendStatus(400)
}
})

//Retrieve Image
app.get('/images', async (req, res) => {
try {
const col = await loadCollection(COLLECTION_NAME, db)
res.send(col.data)
} catch(err) {
res.sendStatus(400)
}
})


// Retrieve Image by Id
app.get('/images/:id', async (req, res) => {
try {

const col = await loadCollection(COLLECTION_NAME, db)
const result = col.get(parseInt(req.params.id))

if(!result) {
res.sendStatus(404)
return;
}

res.setHeader('Content-Type', result.mimetype);
fs.createReadStream(path.join(UPLOAD_PATH, result.filename)).pipe(res)
} catch(err) {
res.sendStatus(400)
}
})

app.listen(3000, function () {
console.log('listening on port 3000!');
})

索引.html

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Fetch Image (NodeJS-LokiJS API) - Example</title>
<style>
.photo {
width: 100px;
display: block;
margin-bottom: 5px;
border: 2px solid black;
}
</style>
</head>
<body>
<h1>HTML Example</h1>
<p>
JPEG:<br>
<img class="photo" src="http://localhost:3000/images/1">
<img class="photo" src="http://localhost:3000/images/2">
<img class="photo" src="http://localhost:3000/images/3">
<img class="photo" src="http://localhost:3000/images/4">
<img class="photo" src="http://localhost:3000/images/5">
<img class="photo" src="http://localhost:3000/images/6">
</p>
</body>
</html>

utils.ts

import * as del from 'del'
import * as Loki from 'lokijs'

const loadCollection = function (colName, db: Loki): Promise<Loki.Collection<any>> {
return new Promise(resolve => {
db.loadDatabase({}, _=> {
const _collection = db.getCollection(colName) || db.addCollection(colName)
resolve(_collection)
})
})
}

const imageFilter = function (req, file, cb) {
// accept image only
if (!file.originalname.match(/\.(jpg|jpeg|png|gif)$/)) {
return cb(new Error('Only image files are allowed!'), false);
}
cb(null, true);
}

export { imageFilter, loadCollection }

最佳答案

看起来 loadCollection 确实有问题。从 loadCollection 中删除 db.loadDatabase 并在初始化后仅在 index.ts 中加载数据库一次。

index.ts

import * as express from 'express'
import * as multer from 'multer'
import * as cors from 'cors'
import * as fs from 'fs'
import * as path from 'path'
import * as Loki from 'lokijs'

import { loadCollection, imageFilter } from './utils'

//setup
const DB_NAME = 'db.json'
const COLLECTION_NAME = 'images'
const UPLOAD_PATH = 'uploads'
const upload = multer({ dest: `${UPLOAD_PATH}/`, fileFilter: imageFilter }) //MULTER CONFIG
const db = new Loki(`${UPLOAD_PATH}/${DB_NAME}`, { persistenceMethod: 'fs' })
db.loadDatabase({});

// app
const app = express();
app.use(cors());

app.get('/', (req, res) => {
res.json({responseText : 'Server running successfully'})
})


//Upload Single
app.post('/fileUpload', upload.single('file'), async (req, res) => {

try {
const col = await loadCollection(COLLECTION_NAME, db)
const data = col.insert(req.file)

db.saveDatabase()
res.send({id: data.$loki, fileName: data.filename, originalName: data.originalname })
} catch (err) {
res.sendStatus(400)
}
})

//Upload Multiple
app.post('/photos/upload', upload.array('photos', 12), async (req, res) => {

try {
const col = await loadCollection(COLLECTION_NAME, db)
const data = [].concat(col.insert(req.files))

db.saveDatabase()
res.send(data.map(x => ({ id: x.$loki, fileName: x.filename, originalName: x.originalname })));
} catch (err) {
res.sendStatus(400)
}
})

//Retrieve Image
app.get('/images', async (req, res) => {
try {
const col = await loadCollection(COLLECTION_NAME, db)
res.send(col.data)
} catch(err) {
res.sendStatus(400)
}
})


// Retrieve Image by Id
app.get('/images/:id', async (req, res) => {
try {

const col = await loadCollection(COLLECTION_NAME, db)
const result = col.get(parseInt(req.params.id))

if(!result) {
res.sendStatus(404)
return;
}

res.setHeader('Content-Type', result.mimetype);
fs.createReadStream(path.join(UPLOAD_PATH, result.filename)).pipe(res)
} catch(err) {
res.sendStatus(400)
}
})

app.listen(3000, function () {
console.log('listening on port 3000!');
})

utils.ts

import * as del from 'del'
import * as Loki from 'lokijs'

const loadCollection = function (colName, db: Loki): Promise<Loki.Collection<any>> {
return new Promise(resolve => {
const _collection = db.getCollection(colName) || db.addCollection(colName)
resolve(_collection)
})
}

const imageFilter = function (req, file, cb) {
// accept image only
if (!file.originalname.match(/\.(jpg|jpeg|png|gif)$/)) {
return cb(new Error('Only image files are allowed!'), false);
}
cb(null, true);
}

export { imageFilter, loadCollection }

关于node.js - Node-LokiJS : not all get requests are fulfilled, 请求状态永远处于待处理状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58767541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com