node.js - 如何从使用 gridFS 存储的 mongodb 读取 mp3 文件?

标签 node.js mongodb angular express ionic2

我的代码:

storeAudio.js

var mongoose = require('mongoose');
var fs = require('fs');
var Grid = require('gridfs-stream');
Grid.mongo=mongoose.mongo;


//establish mongoDB connection
 mongoose.Promise = global.Promise;
var conn = mongoose.createConnection('mongodb://localhost:27017/aHolyBoly');
conn.once('open',function(){
   var gfs = Grid(conn.db);
 // var db = new mongo.Db('aHolyBoly', new mongo.Server("127.0.0.1", 27017));
//var gfs = Grid(db, mongo);

var writeStream = gfs.createWriteStream({
    filename:'song1.mp3'
});
fs.createReadStream('../list/hero.mp3').pipe(writeStream);
writeStream.on('close',function(file){
    console.log(file.filename +'Written to db');
});
});

我的mp3文件已成功写入数据库。 现在我的目标是使用 Express 创建路线,以便我可以将其用作 API,在我的 angular2 应用程序中用作提供程序。

server.js

var mongoose = require('mongoose');
var fs = require('fs');
var Grid = require('gridfs-stream');
Grid.mongo=mongoose.mongo;


//establish mongoDB connection
 mongoose.Promise = global.Promise;
var conn = mongoose.createConnection('mongodb://localhost:27017/aHolyBoly');
conn.once('open',function(){
   var gfs = Grid(conn.db);
 // var db = new mongo.Db('aHolyBoly', new mongo.Server("127.0.0.1", 27017));
//var gfs = Grid(db, mongo);

var writeStream = gfs.createWriteStream({
    filename:'song1.mp3'
});
fs.createReadStream('../list/hero.mp3').pipe(writeStream);
writeStream.on('close',function(file){
    console.log(file.filename +'Written to db');
});
});

在我的代码中的某个地方,我无法找到使用 gridFS 在数据库中编写的歌曲。 gridFS API 链接 gridFS API Link

我想使用 ionic2 创建一个应用程序,其中包含一个搜索栏,当我输入歌曲名称时,它将显示歌曲并且我可以播放它。

我花了 1 周的时间在堆栈上写了 3 次,但无法得到答案。

最佳答案

我敢打赌您是服务器端 Web 开发的新手,因为您的问题有点忽略了创建 Node.js 应用程序的全部要点。

编写服务器时,目标是服务器无法访问客户端计算机上的文件。这意味着您的应用程序充当瘦客户端。不要混淆 Node.js 也在您的计算机上运行:它创建了自己的模拟服务器,该服务器充当真正的远程计算机,即使它与您使用的计算机位于同一台计算机上。因此,您无法修改项目库之外的文件,或者即使可以,这也将是一种黑客攻击,而且这不是 Node.js 的用途。

如果您想要一个专门修改计算机上文件的程序,您应该学习厚客户端编程语言,例如 C、C++ 或 Java。它们只能在您的计算机上运行,​​并且可以完全访问您的任何文件。

如果您出于某种原因坚持使用 JavaScript,它也有能力修改您的文件,但它仍然不是它的预期用途。您必须授予它特殊的权限,但您向浏览器授予对所有个人文件的访问权限仍然很奇怪。然而,这个Javascript代码id在客户端,即你不需要node.js,也不需要express。客户端代码可以使用单个浏览器编写和运行。查看this article了解更多相关信息。

但是如果您仍然确信 node 是您的方式,那么您仍然有一些选择。首先,但我不认为这是你的答案:编写一个上传网站,将 mp3 文件上传到你的服务器(仍在同一台计算机上,但将其放在项目位置)。它应该可以工作并且看起来像一个实际的网站(就像 Node.js 的用途一样)。最后你所要求的可以有点实现,但它确实很hacky,你可以尝试从应用程序路径中引用它,如

var fs = require('fs'),
path = require('path'),    
filePath = path.join(__dirname, '../outerfile.mp3')
filePath2 = path.join('/var/outerfile.mp3');

但是,它的运行方式可能取决于平台,并且根本不可能工作。

我的最终建议:您应该考虑为您的项目使用另一种语言。

关于node.js - 如何从使用 gridFS 存储的 mongodb 读取 mp3 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43860406/

相关文章:

angular - 使用 ngFor 循环并跳过第 n 个元素

angular - 分层 TreeView 使用 Angular 8 中的 Ul li 展开折叠

javascript - Node 需要用方括号传递 arg 的模块?这是一个错误吗?

javascript - 如何从 style 属性获取图像 url

node.js - 对于数量大于 10 的更新组,TransactWriteItems API 失败。错误 : Member must have length less than or equal to 10

javascript - 如何在 Jest 中的异步函数中抛出错误

java - 使用 Java 和 MongoDB 进行参数化查询

mongodb - 使用 nodejs 将非常大的记录集导入 MongoDB

java - 从嵌套的用户定义对象中创建 DataFrame

javascript - 在 Angular 6 中自动滚动到组件 AfterViewInit,不工作