发送数据在send_resp中发送

时间:2017-04-22 02:27:47

标签: elixir phoenix-framework

所以我试图构建一个带有一些错误处理的插件,如果用户没有通过身份验证来发送响应。这是我的代码:

defp respond(conn, :json, status, msg) do
    try do
      conn
      |> put_resp_content_type("application/json")
      #|> send_resp(status, Poison.encode!(%{errors: msg}))
      |> put_status(status)
      |> put_view(ChatApp.Web.UsersView)
      |> render("error_user_creation.json", string: msg)
      |> IO.inspect
      |> halt
    rescue ArgumentError ->
      conn
      |> put_resp_content_type("application/json")
      |> send_resp(status, Poison.encode!(%{errors: [msg]}))
      |> halt
    end
 end

所以它几乎正常工作,Inspect正在看

  

州::发送,状态:401

发送时,但从不发送我的错误消息。

我想第二个问题是,我真正想做的是将许多这些模板保存在error_view.ex文件中并使用Phoenix的渲染。

看到宏选择使用使用的命名约定,我有办法强制在另一个模块中渲染某个视图吗?

我对Elixir很新,所以感谢你的帮助!

编辑:

所以我找到 put_view 但是当我有200以外的任何错误代码时,这似乎不起作用。

如果我执行任何错误代码,它似乎不会发回消息,而只是专门为此插件发送消息。如果我在控制器的任何其他位置上执行 put_status ,它的工作方式完全正常但不在此处。

这是新代码:

case Accounts.check_token(List.first(token)) do
       {:ok, user} ->
            conn
            |>GeneralUtils.put_private(:user, user)
            |> AuthResponses.unauthorized
        :error ->
            conn
            |> GeneralUtils.put_private(:error, {:error, "You do not have permissions"})
     end

然而,只要状态为200,它就会发送我正在发送的正确的身体,如果它是其他任何东西它将会失败。

编辑,编辑:

我的代码运行完全合理,状态代码为200,但在放入其他内容时,它会中断:

它被称为这样:

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.lang.*;



    public class DivisorException extends JFrame implements ActionListener{

//data fields
final int WIDTH = 300; 
final int HEIGHT = 200;
public String divisors;
private int num;
private JButton find = new JButton("Find"); 
private JLabel question =  new JLabel("Enter a number to find all of its divisors"); 
private JTextField answer = new JTextField(8); 
private JLabel feedback = new JLabel("");


//constructor
public DivisorException(){

    //call super class constructor  --> "Name the Window"
    super("Divisor");

    //set characteristics
    setSize(WIDTH,HEIGHT);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLayout(new FlowLayout()); 

    //add components
    add(question); 
    add(answer); 
    answer.addActionListener(this);
    add(find);
    find.addActionListener(this);
    add(feedback);
    }


 @Override
 public void actionPerformed(ActionEvent e){
        try{
            num = Integer.parseInt(answer.getText());
                if(e.getSource().equals(find)){
                feedback.setText("The divisors are: " + divisors);

                }


            }catch(NumberFormatException ex){
                feedback.setText("Invalid input. Enter an integer!");
                answer.setText("");
                }
        }


    private String divisor(int num){

        String divisors = "";
        for(int i = 1; i <= num; i++){
            if(num % i == 0){

                divisors = (i + ", ");          
            }
        }
        return divisors;
    }

}

我也知道这个AuthResponses.unauthorized应该是错误的,我现在正在测试,这更容易。

1 个答案:

答案 0 :(得分:0)

  

我想第二个问题是,我真正想做的是将许多这些模板保存在error_view.ex文件中并使用Phoenix的渲染。

关注这一点,我可以直接回答你...... https://hexdocs.pm/phoenix/Phoenix.Controller.html#render/4

只需解决它,您将View模块作为第二个参数传递,与该View模块相关的模板以及您想要的分配。

关于用于身份验证的插件,除非您将其创建为学习elixir的方法,否则我建议您使用Guardian。这是一篇简单的文章,解释了如何使用api和凤凰html

的守护者