POST http://localhost:3000/api/v1/register 500(内部服务器错误)添加cloudinary。当我在邮递员上运行时它工作正常,但是当我添加 cloudinary 时出现上述错误。我尝试了很多方法,但似乎没有用。 có vẻ như tôi đang sử dụng phiên bản cũ。我应该降级版本吗?????`
`Code in controllers file from backend`
//Register a user http://localhost:4000/api/v1/register
const regiesterUser = catchAsyncError(async(req, res, next) =>{
const result = await cloudinary.v2.uploader.upload(req.body.avatar, {
folder: 'avatars',
width: 150,
crop: "scale"
})
const { name, password, email} = req.body;
const user = await User.create({
name,
password,
email,
avatar:{
public_id: result.public_id,
url: result.secure_url
}
})
sendToken(user, 201, res);
})
来自前端的 userAction 中的代码
// Register user
export const register = (userData) => async (dispatch) => {
try {
dispatch({ type: REGISTER_USER_REQUEST })
const config = {
headers: {
'Content-Type': 'multipart/form-data'
}
}
const { data } = await axios.post('/api/v1/register', userData, config)
dispatch({
type: REGISTER_USER_SUCCESS,
payload: data.user
})
} catch (error) {
dispatch({
type: REGISTER_USER_FAIL,
payload: error.response.data.message
})
}
}
`
`Code in componnents from frontend`
`
const Register = () => {
const [user, setUser] = useState({
name: '',
email: '',
password: '',
});
const { name, email, password } = user;
const [avatar, setAvatar] = useState('');
const [avatarPreview, setAvatarPreview] = useState('/images/default_avatar.jpg')
const { isAuthenticated, error, loading } = useSelector(state => state.auth);
const navigate = useNavigate();
const alert = useAlert();
const dispatch = useDispatch();
useEffect(() => {
if (isAuthenticated) {
navigate('/')
}
if (error) {
alert.error(error)
dispatch(clearErrors());
}
}, [dispatch, alert, isAuthenticated, error, navigate]);
const submitHandler = (e) => {
e.preventDefault();
const formData = new FormData();
formData.set('name', name);
formData.set('email', email);
formData.set('password', password);
formData.set('avatar', avatar);
dispatch(register(formData))
}
const onChange = (e) => {
if(e.target.name === 'avatar') {
const reader = new FileReader();
reader.onload = () => {
if(reader.readyState === 2) {
setAvatarPreview(reader.result);
setAvatar(reader.result);
}
}
if(e.target.files[0]){
reader.readAsDataURL(e.target.files[0])
}
}else {
setUser( {...user, [e.target.name]: e.target.value })
}
}
return (
<Fragment>
<MetaData title={'Register'} />
<div className="row wrapper">
<div className="col-10 col-lg-5">
<form className="shadow-lg" onSubmit={submitHandler} encType='multipart/form-data'>
<h1 className="mb-3">Register</h1>
<div className="form-group">
<label htmlFor="email_field">Name</label>
<input
type="name"
id="name_field"
className="form-control"
name='name'
value={name}
onChange={onChange}
/>
</div>
<div className="form-group">
<label htmlFor="email_field">Email</label>
<input
type="email"
id="email_field"
className="form-control"
name='email'
value={email}
onChange={onChange} />
</div>
<div className="form-group">
<label htmlFor="password_field">Password</label>
<input
type="password"
id="password_field"
className="form-control"
name='password'
value={password}
onChange={onChange} />
</div>
<div className='form-group'>
<label htmlFor='avatar_upload'>Avatar</label>
<div className='d-flex align-items-center'>
<div>
<figure className='avatar mr-3 item-rtl'>
<img src={avatarPreview} className='rounded-circle' alt='Avatar preview' />
</figure>
</div>
<div className='custom-file'>
<input
type='file'
name='avatar'
className='custom-file-input'
id='customFile'
accept="images/*"
onChange={onChange}
/>
<label className='custom-file-label' htmlFor='customFile'>
Choose Avatar
</label>
</div>
</div>
</div>
<button
id="register_button"
type="submit"
className="btn btn-block py-3"
disabled = {loading ? true : false}
>
REGISTER
</button>
</form>
</div>
</div>
</Fragment>
);
}
export default Register;
`