【发布时间】:2019-08-28 09:35:39
【问题描述】:
我有 NodeJs / ExpressJs 作为后端服务器(Ubuntu 18.04.3 LTS),当我从前端(JavaScript)或 POSTMAN 发出 AJAX GET 或 POST 请求时,它工作得非常好(如预期的那样)。 当我使用 Alamofire (swift) 发出 GET 请求时,它也可以按预期工作,但是当我从 Alamofire 发出 POST 请求时,会将空数据发送(或接收)到 NodeJs / ExpressJs 服务器。
在我的 NodeJs 服务器中,我使用强大的来解析正文 (FormData),而在我的前端 (JavaScript) 中,我使用 FormData api 和标头 content-type: false 发送数据。
当我从 Alamofire 向我的后端服务器发送一个 POST 请求时,我在其中设置了标头
- 内容类型为假
- 内容类型为 multipart/formdata
- 没有内容类型
但仍在发送空数据(或服务器上正在接收空数据)
alamofire 代码
func uploadPostWithImageAndText() {
let parameters = [
"shared" : "Public",
"post": self.textView.text
] as [String : Any]
let recovedUserJsonData = UserDefaults.standard.object(forKey: "userData")
let recovedUserJson = NSKeyedUnarchiver.unarchiveObject(with: recovedUserJsonData as! Data) as! NSDictionary
// print(recovedUserJson)
var token = recovedUserJson.value(forKey: "token") as! String
token = String(format: "%@", token)
// print(token)
let headers = [
"Authorization" : token
]
let imgData = imgView.image?.jpegData(compressionQuality: 0.2)
Alamofire.upload(multipartFormData: { multipartFormData in
//Parameter for Upload files
multipartFormData.append(imgData!, withName: "fileUpload",fileName: "fileUpload" , mimeType: "image/png")
for (key, value) in parameters
{
multipartFormData.append(key.data(using: .utf8)!, withName: value as! String)
}
}, usingThreshold:UInt64.init(),
to: "https://apis.example.com/apis/feed/create-post", //URL Here
method: .post,
headers: headers, //pass header dictionary here
encodingCompletion: { (result) in
switch result {
case .success(let upload, _, _):
print("the status code is :")
upload.uploadProgress(closure: { (progress) in
print("something")
})
upload.responseJSON { response in
print("the resopnse code is : \(response.response?.statusCode)")
print("the response is : \(response)")
}
break
case .failure(let encodingError):
print("the error is : \(encodingError.localizedDescription)")
break
}
})
在 ExpressJs 中我有 FormData 的正文解析器
app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));
app.use(bodyParser.json({ limit: '50mb' }));
我正在使用formidable 模块来解析正文。
我在 Alamofire 中遇到错误
<4> load failed with error Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=-2102, NSUnderlyingError=0x60000193f150 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <16AA23FC-8DFC-4598-B032-96636892F2B7>.<4>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalDataTask <16AA23FC-8DFC-4598-B032-96636892F2B7>.<4>"
), NSLocalizedDescription=The request timed out., NSErrorFailingURLStringKey=https://apis.example.com/apis/feed/create-post, NSErrorFailingURLKey=https://apis.example.com/apis/feed/create-post, _kCFStreamErrorDomainKey=4} [-1001]
我在后端有控制台记录的传入请求
console.log('fields', fields);
路线
router.post('/create-post' ,postCont.createPost);
谁的日志是空的
fields {}
我不明白为什么后端(api端点)收到空数据,谢谢。
【问题讨论】:
标签: node.js express mongoose alamofire formidable