0

Mongoose、Express、および GridFS-Stream を使用して、アプリケーションの API を作成しています。ユーザーが作成する記事のスキーマがあります。

var articleSchema = mongoose.Schema({
    title:String,
    author:String,
    type: String,
    images: {type: Schema.Types.ObjectId, ref: "fs.files"},
    datePublished: { type: Date, default: Date.now },
    content: String
})
var Article = mongoose.model("article", articleSchema, "articles");

そして、ユーザーが画像をアップロードするときの私の grid-fs 設定:

api.post('/file', fileUpload.single("image"), function(req, res) {
var path = req.file.path;
var gridWriteStream = gfs.createWriteStream(path)
    .on('close',function(){
        //remove file on close of mongo connection
        setTimeout(function(){
            fs.unlink(req.file.path);
        },1000);
    })
var readStream = fs.createReadStream(path)
    .on('end',function(){
        res.status(200).json({"id":readStream.id});
        console.log(readStream);
    })
    .on('error',function(){
        res.status(500).send("Something went wrong. :(");
    })
    .pipe(gridWriteStream)

});

現在、ユーザーが画像を選択すると、gridfs-stream を介して自動的にアップロードされ、一時フォルダーに配置され、mongo サーバーにアップロードされたときに削除され、コンソールで ObjectId が何であるかが返されるように設定されています。 . これですべてが見つかりますが、この ID を articleSchema に関連付ける必要があるため、アプリでその記事を呼び出すと、関連付けられた画像が表示されます。

ユーザーが送信を押したときの記事の作成/更新について:

createArticle(event) {
event.preventDefault();
var article = {
  type: this.refs.type.getValue(),
  author: this.refs.author.getValue(),
  title: this.refs.title.getValue(),
  content: this.refs.pm.getContent('html')
};
var image = {
  images: this.refs.imageUpload.state.imageString
};
var id = {_id: this.refs.id.getValue()};
var payload = _.merge(id, article, image);
var newPayload = _.merge(article, image)
if(this.props.params.id){
  superagent.put("http://"+this.context.config.API_SERVER+"/api/v1.0/article/").send(payload).end((err, res) => {
      err ? console.log(err) : console.log(res);
  });
} else {
  superagent.post("http://"+this.context.config.API_SERVER+"/api/v1.0/article").send(newPayload).end((err, res) => {
    err ? console.log(err) : console.log(res);
    this.replaceState(this.getInitialState())
    this.refs.articleForm.reset();
  });
}

}、

したがって、ユーザーが記事の作成時に送信を押したときに、スキーマの画像セクションにアップロードしたばかりの画像の ID を呼び出す必要があります。送信時に readstream を実行しようとしましたが、問題は ID またはファイル名を取得して関連付けることができないことです。

それらはmongoデータベースに保存され、fs.filesとfs.chunksが作成されますが、私の人生では、そのデータを取得してスキーマに添付する方法、またはデータを取得する方法さえわかりません、ObjectId を知らなくても。

では、fs.files または fs.chunks から objectid を呼び出してスキーマにアタッチするにはどうすればよいでしょうか? スキーマで fs.files またはチャンクを参照するにはどうすればよいですか? オブジェクトIDが何に関連付けられているかを知っていますか?

私が持っているものが漠然としている場合、私はそれを行う厄介な習慣を持っています. ごめん。

4

1 に答える 1

1

だから私は自分の問題を解決することになりました.最善の解決策ではないかもしれませんが、より良い解決策が得られるまではうまくいきます.

API が変更されました

res.status(200).json({"id":readStream.id});

res.status(200).send(readStream.id);

私のコンポーネントでは、状態を response.body に設定します。これにより、アップロードされた画像の ID の状態が設定されます。したがって、メイン ビューでは、画像アップロード コンポーネントを参照し、ビューの画像状態をコンポーネントの ID 状態に設定します。ビオラ、新しく作成された記事に関連付けられた ID をデータベースに取得しました。

私が遭遇した問題は、何を参照すればよいかわからなかったことです。API URL を id に添付すると、URL img を参照しているように動作し、画像が正しくレンダリングされます。

繰り返しますが、これは最善の方法ではないかもしれません。実際、そうではないと確信していますが、データベースを正しく参照するか、単に格納するだけの新しいコンポーネントを作成できるようになるまで、今のところ機能しています。サーバー上のすべての画像を参照し、wordpress と同じように参照します。

于 2016-03-09T18:38:50.323 に答える