因此,我使用 MongoDB Atlas、Mongoose、Multer 和 GridFsStorage 将文件上传到云上的单个数据库,效果很好,但我希望能够动态使用不同的数据库连接将文件上传到不同的数据库。
为此,我想设置 Multer GridFsStorage 配置,以便“db”属性字段根据 API 请求动态更改。但是,我无法访问“db”属性内的 HTTP 请求对象,这使得我可以动态更改数据库连接。GridFsStorage 配置对象中的
“db”属性仅接受以下内容:
在下面的示例中,您可以看到我正在使用自定义 getDatabaseConnection() 方法创建数据库连接,然后将该连接传递到接受单个静态数据库连接的数据库字段中。
// Multer GridFsStorage configuration.
const storage = new GridFsStorage({
// I NEED TO CHANGE THE DB CONNECTION DYNAMICALLY TO UPLOAD FILES TO DIFFERENT
// DATABASES, BUT I HAVE NO ACCESS TO THE HTTP REQUEST OBJECT INSIDE THE DB FIELD!
db: connectionFactory.getDatabaseConnection(process.env.DB_CONNECT),
// I can access the request object (req) inside the "file" field.
file: …
Run Code Online (Sandbox Code Playgroud) 所以我想使用 Node.js 服务器使用Express、Mongoose 和 Multer 的 GridFS 存储引擎将大型 CSV 文件上传到 mongoDB 云数据库,但是当文件上传开始时,我的数据库变得无法处理任何其他 API 请求。例如,如果在上传文件时,另一个客户端请求从数据库获取用户,服务器会收到该请求并尝试从 MongoDB 云获取该用户,但由于大文件上传,该请求会被卡住耗尽所有计算资源。因此,客户端执行的 get 请求将不会返回用户,直到正在进行的文件上传完成。
据我所知,如果一个线程花费很长时间来执行回调(事件循环)或任务(Worker),那么它被视为“阻塞”,并且 Node.js 在事件循环中运行 JavaScript 代码,同时它提供了一个 Worker用于处理文件 I/O 等昂贵任务的池。我在NodeJs.org 的这篇博文中读到,为了保持 Node.js 服务器的快速运行,在任何给定时间与每个客户端相关的工作必须是“小”,并且我的目标应该是尽量减少任务次数。其背后的原因是,如果工作人员当前的任务比其他任务昂贵得多,则它将无法处理其他待处理的任务,从而将工作人员池的大小减少一,直到该任务完成。
换句话说,执行大文件上传的客户端正在执行一个昂贵的任务,这会降低工作池的吞吐量,进而降低服务器的吞吐量。根据前面提到的博文,当每个子任务完成时,应该提交下一个子任务,当最后一个子任务完成时,应该通知提交者。这样,在长任务(大文件上传)的每个子任务之间,Worker 可以处理较短任务的子任务,从而解决阻塞问题。
但是,我不知道如何在实际代码中实现这个解决方案。有没有什么特定的分区函数可以解决这个问题?我是否必须使用 multer-gridfs-storage 之外的特定上传架构或节点包来上传文件?请帮忙
这是我当前使用 Multer 的 GridFS 存储引擎实现的文件上传:
// Adjust how files get stored.
const storage = new GridFsStorage({
// The DB connection
db: globalConnection,
// The file's storage configurations.
file: (req, …
Run Code Online (Sandbox Code Playgroud) 所以我有一段时间出于调试原因在Python 的 Localhost上运行我的应用程序,但现在我非常想让我的Flask应用程序在我的Apache Localhost上运行。我已经在 Vagrant 上配置了 Ubuntu 以在 Apache 上运行该应用程序,现在唯一不起作用的是 Facebook 登录。虽然我的 Google Sign-in 方法在 Python 的 Localhost 和 Apache 上都可以正常工作,但我的 Facebook Sign-in 方法仅适用于 Python 的 Localhost 而出于某种原因不适用于 Apache 的 Localhost。
具体来说,在我执行fb 登录功能的fbconnect() 方法中,当代码到达给定代码块的第 4 次打印(print("4. FB http request results: %s" % result))时(向下滚动)对于代码块),第 4 次打印发出的消息是此错误:
4. FB http request results: b'{"error":{"message":"Invalid OAuth access token.","type":"OAuthException","code":190,"fbtrace_id":"AjWGMxq54MULV0sCpjpW2DT"}}'
Run Code Online (Sandbox Code Playgroud)
我不知道b'在那里做什么(它出现在错误消息的开头)以及如何删除它 …
flask python-2.7 python-3.x python-requests facebook-access-token
mongodb ×2
multer ×2
file ×1
flask ×1
gridfs ×1
mongoose ×1
node.js ×1
partitioning ×1
python-2.7 ×1
python-3.x ×1