Multer - 错误:意外现场
问题描述:
我得到一个漫长的错误,当我尝试我多形式的数据传递到后端:Multer - 错误:意外现场
Error: Unexpected field
at makeError (/Users/****/Documents/Programming Projects/JavaScript/Angular/Back-Yard-Brewing/node_modules/multer/lib/make-error.js:12:13)
at wrappedFileFilter (/Users/****/Documents/Programming Projects/JavaScript/Angular/Back-Yard-Brewing/node_modules/multer/index.js:39:19)
at Busboy.<anonymous> (/Users/****/Documents/Programming Projects/JavaScript/Angular/Back-Yard-Brewing/node_modules/multer/lib/make-middleware.js:112:7)
at emitMany (events.js:108:13)
at Busboy.emit (events.js:182:7)
at Busboy.emit (/Users/****/Documents/Programming Projects/JavaScript/Angular/Back-Yard-Brewing/node_modules/multer/node_modules/busboy/lib/main.js:31:35)
at PartStream.<anonymous> (/Users/****/Documents/Programming Projects/JavaScript/Angular/Back-Yard-Brewing/node_modules/multer/node_modules/busboy/lib/types/multipart.js:208:13)
at emitOne (events.js:77:13)
at PartStream.emit (events.js:169:7)
at HeaderParser.<anonymous> (/Users/****/Documents/Programming Projects/JavaScript/Angular/Back-Yard-Brewing/node_modules/multer/node_modules/busboy/node_modules/dicer/lib/Dicer.js:51:16)
at emitOne (events.js:77:13)
我想我知道是什么问题,我只是不”不知道如何解决它。在我的代码中,我使用一个服务来追加我的多部分表单,然后将其发送到服务器。之后,我不知道镜像到达服务器时的名称。因此,我不需要将其命名为“图片”,而需要将其命名为更具体的内容。问题是,我不知道是什么。这里是我的代码:
前端
<label>Beer Name</label></br>
<input ng-model="recipe.alias"></br>
<label>Image</label></br>
<input type="file" file-model="recipe.image">
<label>Category</label></br>
<select ng-options="beer.alias as beer.alias for beer in beerTypes" ng-model="recipe.selectedCategory" ng-change="filterByCategory(selectedCategory)">
</select></br>
<label>Description</label></br>
<textarea maxlength="500" ng-model="recipe.description" cols="50" rows="5" class="input-box"></textarea></br>
<p>Character count: {{recipe.description.length}} out of 500</p>
<label>Instructions</label></br>
<textarea maxlength="1000" ng-model="recipe.instructions" cols="50" rows="5" class="input-box"></textarea></br>
<p> Character count: {{recipe.instructions.length}} out of 1000 (Minimum: 500)</p>
<button ng-click="createRecipe()" class="button-color btn btn-default">submit</button></br>
角
$scope.recipe = {alias: null, selectedCategory: null, description: null, instructions: null, username: null, userID: null, image: null};
$scope.createRecipe = function(){
authService.getUserInfo(function(user){
// add the user information to the recipe
$scope.recipe.username = user.username;
$scope.recipe.userID = user._id;
});
multipartForm.post("/createrecipe", $scope.recipe);
}
角服务
.service("multipartForm", ["$http", function($http){
this.post = function(uploadUrl, data){
var fd = new FormData();
for(key in data){
fd.append(key, data[key]);
}
$http.post(uploadUrl, fd, {
transformRequest: angular.identity,
headers: {"Content-Type" : undefined}
});
}
}]);
服务器文件
var express = require("express");
var bodyParser = require("body-parser");
var session = require("express-session");
var multer = require("multer");
var upload = multer({ dest: "./uploads"})
var server = express();
var recipeController = require("./controllers/RecipeController")
var favRecipeController = require("./controllers/FavRecipeController")
var authenticationController = require('./controllers/Authentication');
var passportConfig = require('./config/passport');
var passport = require('passport');
//application configuration
//resave will keep it true
server.sessionMiddleware = session({
secret : "123iojojojoiklij",
resave : true,
saveUninitialized : false,
rolling : true,
cookie : {maxAge: 60000 * 60}
});
server.use(server.sessionMiddleware);
//End Express Session Setup
server.use(bodyParser.json());
server.use(bodyParser.urlencoded({ extended: true }));
server.use(express.static(__dirname + "/public"));
server.use(passport.initialize());
server.use(passport.session());
server.post("/createrecipe", upload.single("picture"), recipeController.createRecipe);
所有帮助表示赞赏。
答
OK,这样的回答一个喊出了白袍巫师甘道夫和杉杉:
事实证明我的server.js,在我的岗位到服务器上,我因为single.upload("photo")
只需要为single.upload("image"),
,这就是我在前台贴上的标签。谢谢你的帮助。
获得的经验:即使您通过对象传递多部分表单,multer仍然将其视为您最初标记为的对象。
+0
好伙伴,我很高兴你自己解决了它。干杯! –
multer有指定文件名和目的地的方法,你检查过吗? –
@GandalftheWhite我不太确定我的理解。我知道,一旦它到达后端,您将该文件称为req.file,但是我遇到的问题是一旦它通过我的服务中的format.append,我不知道该映像的名称是什么。是否有文件进入你所说的? – user5854440
使用multer你可以访问发送给它的文件名,甚至给出一个新名称。使用ng-file-upload作为前端,它会让你的任务变得简单。 –